问答题
设有两个栈s1、s2都采用顺序栈方式,并且共享一个存储区[0.maxsize一1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向,迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作算法。【哈尔滨工业大学2001年】
【正确答案】正确答案:两栈共享向量空间,将两栈栈底设在向量两端,初始时,sl栈项指针为一1,s2栈顶指针为maxsize。 两栈顶指针相邻时为栈满。两栈顶相向,迎面增长,栈顶指针指向栈顶元素。 数据结构的设计: typedef struct { elemtp stack[maxsize]; //栈空间 int top[2]; //top为两个栈顶指针 }stk; stk s; //s是如上定义的结构类型变量,为全局变量 1)入栈操作。 算法的基本设计思想: 设置一个变量来标识入哪个栈,若要将元素加入到s1栈中,s1栈顶指针加1;若要将元素加入到s2 栈中,s2栈顶指针减1即可。 算法的代码: int push(int i,int X){ //入栈操作。i为栈号,i=0表示栈S1,i=1表示栈s2,x是入栈元素 //入栈成功返回1,否则返回0 if(i<0 || i>1) { printf(“栈号输入不对\n”); return 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; case 1: s.stack|一s.top[1\]\]=x; return 1; } }//push 2)出栈操作。 算法的基本设计思想: 同理设置一个变量来标识入哪个栈,若是sl栈出栈,s1栈顶指针减_1.若是s2栈出栈,s2栈顶指 针加1即可。 算法的代码: elemtp pop(int i){ //出栈算法。i代表栈号,i=0时为s1栈,i=l时为s2栈 //出栈成功返回出栈元素,否则返回一1 if(i<0 || i>1) { printf(“栈号输入错误\n”); return 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; } e1Se return s.stack[s.top[1]++]; } }//pop 请注意算法中两栈入栈和出栈时的栈顶指针的计算。sl栈是通常意义下的栈,而s2栈入栈操作时, 其栈顶指针减1,出栈时,栈顶指针加1。
【答案解析】