C++ 数据结构 栈之共享栈

  • Post author:
  • Post category:其他




前言

栈(Stack)是一种只允许在一端进行插入或删除操作的

线性表



栈顶(Top)是允许进行插入删除的一端。

栈底(Bottom)是固定不允许插入删除的一端。

栈的操作特性概括为

后进先出

(Last In First Out,LIFO)。

共享栈是让两个顺序栈共享

一个一维数组空间

,将两个栈的

栈底

分别设置在共享空间的

两端

,两个

栈顶

向共享空间的

中间

延伸。

共享栈

相关知识:


C++结构体



C++指针



C++引用



栈之顺序栈



类型描述

假定线性表的元素类型为ElemType。

共享栈的顺序存储类型可描述为:

#define MaxSize 50
typedef struct {
    ElemType data[MaxSize];
    int top0;                   //栈0的栈顶指针(左边)
    int top1;                   //栈1的栈顶指针(右边)
}SharedStack;



基本操作的实现

1.基本操作的实现取决于采用哪种存储结构,存储结构不同,算法的实现也不同;

2.此处将栈0的栈顶指针

top初始化为-1

,将栈1的栈顶指针

top初始化为MaxSize



3.使用一个

flag

标志来区别对哪个栈操作,0表示栈0,1表示栈1;

4.进栈操作:栈不满时,栈顶指针先加1,再送值到栈顶元素;

5.出栈操作:栈非空时,先取出栈顶元素值,再将栈顶指针减1;

6.栈空条件:

S.top0 == -1 && S.top1 == MaxSize

;栈满条件:

S.top1 – S.top0 == 1

//
// Created by Evian on 2020/3/8.
// 共享栈
#include <iostream>
using namespace std;

#define MaxSize 50
typedef int ElemType;

typedef struct {
    ElemType data[MaxSize];
    int top0;                   //栈0的栈顶指针(左边)
    int top1;                   //栈1的栈顶指针(右边)
}SharedStack;

void InitStack(SharedStack &S);
bool isEmpty(SharedStack S);
bool Push(SharedStack &S, ElemType e, int flag);
bool Pop(SharedStack &S, ElemType &x, int flag);
ElemType GetTop(SharedStack S);
void Display(SharedStack S);

int main(){
    SharedStack stack;
    ElemType x0, x1;
    InitStack(stack);
    Push(stack, 1, 0);
    Push(stack, 2, 1);
    Push(stack, 3, 0);
    Push(stack, 4, 1);
    Push(stack, 5, 0);
    Push(stack, 6, 1);
    Display(stack);
    GetTop(stack);
    Pop(stack, x0, 0);
    Pop(stack, x1, 1);
    Display(stack);
    return 0;
}

void InitStack(SharedStack &S){
    S.top0 = -1;
    S.top1 = MaxSize;
}

bool isEmpty(SharedStack S){
    if (S.top0 == -1 && S.top1 == MaxSize){
        return true;
    } else{
        return false;
    }
}

bool Push(SharedStack &S, ElemType e, int flag){
    if (S.top1 - S.top0 == 1){                  //栈满的判断条件是两个栈顶指针相邻
        cout<<"栈为满"<<endl;
        return false;
    } else if (flag == 0){
        S.data[++S.top0] = e;
        return true;
    } else if (flag == 1){
        S.data[--S.top1] = e;
    } else{
        cout<<"请输入有效的flag值(0或1)"<<endl;
        return false;
    }
}

bool Pop(SharedStack &S, ElemType &x, int flag){
    if (flag == 0){
        if (S.top0 == -1){
            cout<<"堆栈0为空"<<endl;
            return false;
        } else{
            cout<<"Stack0 Pop: "<<S.data[S.top0--]<<endl;
            return true;
        }
    } else if (flag == 1){
        if (S.top1 == MaxSize){
            cout<<"堆栈1为空"<<endl;
            return false;
        } else{
            cout<<"Stack1 Pop: "<<S.data[S.top1++]<<endl;
            return true;
        }
    } else{
        cout<<"请输入有效的flag值(0或1)"<<endl;
    }
}

ElemType GetTop(SharedStack S){
    if (S.top0 != -1){
        cout<<"Stack0 Top: "<<S.data[S.top0]<<endl;
    }
    if (S.top1 != MaxSize){
        cout<<"Stack1 Top: "<<S.data[S.top1]<<endl;
    } else{
        cout<<"栈为空"<<endl;
        return -1;
    }
}

//打印栈中元素,栈底在前,栈顶在后
void Display(SharedStack S){
    if (S.top0 != -1){
        cout<<"Stack0: ";
        for (int i = 0; i < S.top0; i++) {
            cout<<S.data[i]<<"--->";
        }
        cout<<S.data[S.top0]<<endl;
    }
    if (S.top1 != MaxSize){
        cout<<"Stack1: ";
        for (int i = MaxSize-1; i > S.top1; i--) {
            cout<<S.data[i]<<"--->";
        }
        cout<<S.data[S.top1]<<endl;
    } else{
        cout<<"栈为空"<<endl;
    }
}

以下为打印结果:

Stack0: 1--->3--->5
Stack1: 2--->4--->6
Stack0 Top: 5
Stack1 Top: 6
Stack0 Pop: 5
Stack1 Pop: 6
Stack0: 1--->3
Stack1: 2--->4

如有错误,还请指正!TkY 0.0



版权声明:本文为qq_43174363原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。