共享栈:所谓共享栈就是为了节省空间,让两个栈共享一片连续的存储空间,两个栈从这片连续的共享空间的两端向中间扩充自己的存储空间,设这片存储空间的大小为maxSize,采用栈顶指针始终指向当前栈顶元素的方式来实现共享栈,那么初始栈空时,两个栈的栈顶指针的值分别为:top1==-1,top2==MaxSize
对共享栈进行入栈操作和出栈操作很简单,关键在于要记住——“入栈判满,出栈判空”
共享栈的C语言实现
-
共享栈数据结构定义
//假设栈的实现方式采用,栈顶指针始终指向当前的栈顶元素,也就是说判断栈空的条件为top==-1 typedef struct ShareStack {ElemType data[MaxSize];int top[2]; //存储两个栈的栈顶指针 }*shareStack,St;
- 对共享栈进行初始化操作
//对共享栈进行初始化操作 void Initiate(shareStack Sta) {memset(Sta->data, 0, sizeof(Sta->data)); //将共享栈的数据元素全部初始化为0(Sta->top)[0] = -1;(Sta->top)[1] = MaxSize; }
-
对共享栈进行入栈操作
//入栈操作 void Push(shareStack Sta,ElemType x) {//top[0]表示第一个栈的栈顶指针,初始时top[0]=-1,top[1]表示第二个栈的栈顶指针,初始时top[1]=MaxSizeint stack; //记录当前需要对第几个栈进行入栈操作printf("请输入你要进行入栈操作的那个栈的序号,合法的输入为0,1,分别表示第一个栈和第二个栈\n");scanf("%d", &stack);if (Sta->top[0] + 1 == Sta->top[1]){printf("栈满,无法进行入栈操作\n");return;}switch (stack){case 0://对栈1进行入栈操作Sta->data[++(Sta->top[0])] = x;break;case 1://对栈2进行入栈操作Sta->data[--(Sta->top[1])] = x;} }
-
对共享栈进行出栈操作
//出栈操作 void Pop(shareStack Sta,ElemType &x) {int stack; //用于记录你所需要进行出栈操作的栈的序号printf("请输入你要进行出栈操作的那个栈的序号,合法的输入为0,1,分别表示第一个栈和第二个栈\n");scanf("%d", &stack);switch (stack){case 0:if (Sta->top[0] == -1){printf("栈空,无法进行出栈操作\n");return;}x = Sta->data[(Sta->top[0])--];break;case 1:if (Sta->top[1] == MaxSize){printf("栈空,无法进行出栈操作\n");return;}x = Sta->data[(Sta->top[1])++];} }
用switch语句代替if-else分支语句使程序更简洁