题目
为了充分利用空间,顺序栈s0、s1共享一个存储区elem[0, ... , maxSize-1]。试着设计一个共享栈s0、s1以及有关入栈和出栈操作的算法,假设栈中元素是int型。
分析
算法思想:
1)顺序栈栈底固定不变,因此将栈底设在存储区的两端,即s0栈底设在0处,sI栈底设在maxSize-1处,栈顶在0~maxSize-1的范围内变动。当两栈栈顶相遇时为栈满,这样可以尽可能地利用空间。
2) sO的栈项为top0,s0 入栈操作为: top0 先自增1,然后存入元素:出栈操作为:先取出栈项元素,top0再自减1. sI的栈顶为top1, s1入栈操作为: top1 先自减1,然后存入元素:出栈操作为:先取出栈顶元素,topl 再自增1.
图解:
代码
#include<stdio.h>
#include<stdlib.h>
#define maxSize 20
/* 定义共享栈结构体 */
typedef struct {
int elem[maxSize];// 栈空间
int top[2];// top[0]为s0栈顶,top[1]为s1栈顶
} SqStack;
/* 初始化栈 */
void initStack(SqStack &st) {
st.top[0]=-1;// st0栈的栈底是-1
st.top[1]=maxSize;// st1栈的栈底是maxSize
}
/* 入栈 */
/* &st指的是共享栈;stNo指的是栈的编号,指元素入哪个栈;x指的是要入栈的元素 */
int push(SqStack &st,int stNo,int x) {
if(st.top[0]+1<st.top[1]) { // 栈不满,则元素可以入栈
if(stNo==0) { // 元素入st0
++(st.top[0]);// 栈顶指针先加1
st.elem[st.top[0]]=x;// 将新的元素压入st0栈中
return 1;// 入栈成功返回1
} else if(stNo==1) { // 元素入st1
--(st.top[1]);// 由于st1栈的栈顶元是从数组尾部开始向前的,所以需要减1
st.elem[st.top[1]]=x;// 将元素压入st1栈中
return 1;// 入st1栈成功返回1
} else {
return -1;// 输入栈编号有误,返回-1
}
} else {
return 0;// 栈满后元素不能入栈,返回0
}
}
/* 出栈 */
/* &st指的是共享栈;stNo指的是栈的编号,指元素要出哪个栈;&x接收要栈的栈顶元素 */
int pop(SqStack &st,int stNo,int &x) {
if(stNo==0) { // 表示st0栈的元素出栈
if(st.top[0]!=-1) { // st0不空,则可以出栈
x=st.elem[st.top[0]];// 出栈st0的栈顶元素
--(st.top[0]);// 栈顶指针减1
return 1;// 出栈成功返回1
} else {
return 0;// 栈空,出栈失败返回0
}
} else if(stNo==1) { // 表示st1栈的元素出栈
if(st.top[1]!=maxSize) { // 栈不空,可以出栈
x=st.elem[st.top[1]];// 出栈st1的栈顶元素
++(st.top[1]);// 由于st1栈是从数组尾部开始的,所以需要加1才能表示出栈
return 1;// 出栈成功返回1
} else {
return 0;// 出栈失败返回0
}
} else {
return -1;// 栈编号输入有误,返回-1
}
}
/* 打印共享栈 */
void printStack(SqStack st) {
printf("\n");
for(int i=0; i<=st.top[0]; i++) {
printf("%d\t",st.elem[i]);
}
for(int i=st.top[1]; i<maxSize; i++) {
printf("%d\t",st.elem[i]);
}
printf("\n");
}
int main() {
SqStack st;// 定义共享栈
initStack(st);// 初始化栈
push(st,0,1);// 将元素1压入st0栈
push(st,0,2);// 将元素2压入st0栈
push(st,1,6);// 将元素6压入st1栈
push(st,1,5);// 将元素5压入st1栈
push(st,1,4);// 将元素4压入st1栈
printStack(st);
int x1;
pop(st,0,x1);// 将st0栈中的栈顶元素出栈
printStack(st);// 打印当前栈
int x2;
pop(st,1,x2);// 将st1栈中的栈顶元素出栈
printStack(st);
return 0;
}
运行结果: