问题 问答题

设有两个栈S1,S2都采用顺序栈方式,并且共享一个存储区[O..maxsizel],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计S1,S2有关入栈和出栈的操作算法。

答案

参考答案:两栈共享向量空间,将两栈栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶为maxsize。两栈顶指针相邻时为栈满。两栈顶相向,迎面增长,栈顶指针指向栈顶元素。
#define maxsize 两栈共享顺序存储空间所能达到的最多元素数
#define elemtp int ∥假设元素类型为整型
typedef struct
{elemtp stack[-maxsize]; ∥栈空间
int top[2]; ∥top为两个栈顶指针
}stk;
stk s; ∥s是如上定义的结构类型变量,为全局变量
(1)入栈操作:
int push(int i,int x)
∥入栈操作。i为栈号,i=0表示左边的栈s1,i=1表示右边的栈s2,x是入栈元素。入栈成功返回1,否则返回0。
{if(i<0 ∥ i>1){printf(“栈号输入不对”);exit(0);)
if(s.top[1]-s.top[0]==1){printf(“栈已满\n”);return(0);)
switch(i)
{case 0:s.stack[++s.top[0]]=x;return(1);break;
case 1:s.stack[——s.top[1]]=x;return(1);
}
}∥push
(2)退栈操作
elemtp pop(int i)
∥退栈算法。i代表栈号,i=0时为s1栈,i=1时为S:栈。退栈成功返回退栈元素,否则返回-1。
{if(i<0 ‖ i>1){printf(“栈号输入错误\n”);exit(0);)
switch(i)
{case 0:if(s.top [0]==-1){printf(“栈空\n”);return(-1);)
else return(S.stack Es.top[0]——]);
case 1:if(s.top[1]==maxsize{printf(“栈空\n”);retturn(-1);)
else return(s.stack[s.top [1]++]);
}
}
请注意算法中两栈入栈和退栈时的栈顶指针的计算。s1栈是通常意义下的栈,而s2栈入栈操作时,其栈顶指针左移(减1),退栈时,其栈顶指针右移(加1)。

填空题
单项选择题