应用题 为了增加内存空间的利用率和减少溢出的可能性,通常采用两个栈利用同一块存储空间的方法。通常两个栈的栈底设在内存空间的两端,而栈顶相向,迎面增长。已知有两个栈s1、s2都采用顺序栈方式,并且共享一个存储区[0~maxsize—1]。
设计共享存储空间的两个栈s1、s2的入栈和出栈算法。要求:
问答题 16.给出算法的基本设计思想。
【正确答案】栈s1、s2共享向量空间,将两栈栈底设在向量两端。初始时,sl栈顶指针为-1,s2栈顶为maxsize。两栈顶指针相邻时为栈满。两栈顶相向,迎面增长,栈顶指针指向栈顶元素。
【答案解析】
问答题 17.根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释;
【正确答案】算法设计如下:
#define maxsize //两栈共享顺序存储空间所能达到的最多元素数
#define elemtp int //假设元素类型为整型
typedef struct{
elemtp stack[maxsize];//栈空间
int top[2]; //top为两个栈顶指针
}stk;
stk s; //s是如上定义的结构类型变量,为全局变量
①入栈操作:
int push(int i,int x){ //入栈操作。i为栈号,i=0表示左边的栈sl,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 E0]]=x;return 1;break;
case 1:S.stack[一s.top[1]]=X;return 1;
}
}
②退栈操作:
elemtp pop(int i){
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]++];
}
}
【答案解析】