设有两个栈s1 s2都采用顺序栈方式 并且共享一个存储区[maxsize一1] 为了尽量利用
问题详情
设有两个栈s1、s2都采用顺序栈方式,并且共享一个存储区[maxsize一1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作算法。
请帮忙给出正确答案和分析,谢谢!
参考答案
正确答案:#define maxsize两栈共享顺序存储空间所能达到的最多元素数#define elemtp int//假设元素类型为整型typedef struct{elemtp stack[maxsize];//栈空间int top[2];//top为两个栈顶指针}stk;stk S;//s是如上定义的结构类型变量为全局变量(1)入栈操作int push(int iint X)//入栈操作。i为栈号i=0表示左边的栈sli=1表示右边的栈s2x是人栈元素。入栈成功返回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时为s2栈。退栈成功返回退栈元素否则返回一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[s.top[0]一]);case 1:if(S.top[1]==maxsize{printf(“栈空\n”);return(一1);}else return(s.stack[s.top[1]++]);}}//算法结束
此问题考查的知识点是栈的基本操作。两栈共享向量空间,将两栈栈底设在向量两端,初始时,s1栈顶指针为一1,s2栈顶为maxsize。两栈顶指针相邻时为栈满。两栈顶相向,迎面增长,栈顶指针指向栈顶元素。实现时请注意算法中两栈人栈和退栈时的栈顶指针的计算,可以用两栈共享空间示意图表示,s1栈是通常意义下的栈,而s2栈人栈操作时,其栈顶指针左移(减1),退栈时,栈顶指针右移(加1)。