1、习题三和上机答案上课讲义习题三和上机答案习题三3.1设将整数a,b,c,d依次进栈,但只要出栈时栈非空,则可将出栈操作按任何次序夹入其中,请回答下述问题:(1)若执行以下操作序列Push(a), Pop(),Push(b),Push(c), Pop(), Pop( ),Push(d), Pop( ),则出 栈的数字序列为何(这里Push(i)表示i进栈,Pop( )表示出栈)?(2) 能否得到出栈序列adbc和adcb并说明为什么不能得到或者如何得到。(3)请分析 a,b ,c ,d 的所有排列中,哪些序列是可以通过相应的入出栈操作得到的。解:(1)acbd (2)执行以下操作序列Push(a
2、), Pop(),Push(b),Push(c), Push(d),Pop(), Pop( ), Pop( )就可以得到adcb 栈的特点是“后进先出”,所以不可能得到adbc (3)Push(a), Push(b),Push(c), Push(d),Pop(), Pop( ), Pop( ) ,Pop()可以得到dcba Push(a), Push(b),Push(c), Pop(), Pop( ), Pop( ) , Push(d),Pop()可以得到cbad Push(a), Push(b), Pop(),Pop( ), Push(c), Pop( ) , Push(d), Pop()可
3、以得到bacd Push(a), Push(b), Pop(), Pop( ), Push(c),Push(d), Pop( ) , Pop()可以得到badc Push(a), Pop(),Push(b),Push(c),Push(d), Pop( ), Pop( ) , Pop()可以得到adcb Push(a), Pop(),Push(b),Push(c), Pop( ), Pop( ) , Push(d), Pop()可以得到acbd Push(a), Pop(),Push(b), Pop( ), Push(c), Pop( ) , Push(d), Pop()可以得到abcd Pus
4、h(a), Pop(),Push(b), Pop( ), Push(c), Push(d), Pop( ) , Pop()可以得到abdc分别借助顺序栈和链栈,将单链表倒置。解:顺序表: #include stdio.h#define DataType char#define sqstack_maxsize 40typedef struct sqstack DataType datasqstack_maxsize;int top; SqStackTp;int InitStack(SqStackTp *sq) sq-top=0; return(1);int Push(SqStackTp *sq,
5、DataType x)if(sq-top=sqstack_maxsize-1) printf(栈满); return(0);else sq-top+; sq-datasq-top=x; return(1);int Pop(SqStackTp *sq,DataType *x)if (sq-top=0) printf(下溢); return(0);else *x=sq-datasq-top; sq-top-; return(1);int EmptyStack(SqStackTp *sq)if (sq-top=0)return(1);else return(0);/*主函数*/void main()
6、 SqStackTp sq;DataType ch;InitStack(&sq);for (ch=A;chdata=x;p-next=*ls;*ls=p;int Pop(LStackTp *ls,datatype *x) LStackTp p;if(*ls)!=NULL) p=*ls;*x=p-data;*ls=(*ls)-next;free(p);return(1); else return(0);int EmptyStack(LStackTp ls)if(ls=NULL) return(1);else return(0);void main() LStackTp ls;datatype c
7、h;InitStack(ls);for (ch=A;chdata);printf(n);while(!EmptyStack(ls) Pop(&ls,&ch);printf(%c,ch); printf(n); 有两个栈A,B这两个栈中分别存储这一个升序数列,现要求编写算法把这两个栈中的数合成一个升序队列解:link merge(link a,link b) link h,s,m,n,t; h=(cnode *)malloc(sizeof(cnode); h-next=NULL; s=h; m=a; n=b; while(m-next&n-next) if(m-next-datanext-dat
8、a) t=m-next; m-next=t-next; t-next=s-next; s-next=t; s=t; else if(m-next-data=n-next-data) t=m-next; m-next=t-next; n=n-next; t-next=s-next; s-next=t; s=t; else t=n-next; n-next=t-next; t-next=s-next; s-next=t; s=t; while(m-next) t=m-next; m-next=t-next; t-next=s-next; s-next=t; s=t; while(n-next) t
9、=n-next; n-next=t-next; t-next=s-next; s-next=t; s=t; free(m); free(n); return h;4 设两个栈共享一个数组空间,其类型定义见节,试写出两个栈公用的读栈顶元算法elemtp top_dustack(dustacktp ds,p;int i);进栈操作算法void push_dustack(dustacktp ds,p;int i , elemtp x);及出栈算法 elemtp pop_ dustack(dustacktp ds,p;int i )。其中i的取值是1或2,用以指示栈号。解:读栈顶元函数 elemtp
10、top_sqstack(s:sqstacktp) if( s.top=0) return(null); elsereturn(s.elems.top); 进栈操作 void push_sqstack(sqstacktp s,elemtp x) 若栈s未满,将元素x压入栈中;否则,栈的状态不变并给出出错信息 if(s.top=maxsize) printf(“Overflow”); else s.top+; 栈顶指针加1 s.elems.top=x x进栈 出栈函数 elemtp pop_sqstack(sqstacktp s) 若栈s不空,则删去栈顶元素并返回元素值,否则返回空元素NULL i
11、f(s.top=0) return(null); else s.top-; 栈顶指针减1 teturn(s.elems.top+1); 返回原栈顶元素值 5假设以数组sequ(0.m-1)存放循环队列元素,同时设变量rear和quelen分别指示循环队列中队尾元素和内含元素的个数。试给出此循环队列的队满条件,并写出相应的入队列和出队列的算法(在出队列的算法中要返回队头元素)。解:队满的条件 (sq.rear+1) MOD maxsize=sq.front 入队列操作 void en_cqueue(cqueuetp cq,elemtp x) 若循环队列cq未满,插入x为新的队尾元素;否则队列状态
12、不变并给出错误信息 if (cq.rear+1) MOD maxsize=cq.front) printf(“Overflow”); else cq.rear=(cq.rear+1) MOD maxsize; cq.elemcq.rear=x 出队列函数 elemtp dl_cqueue(VAR cq:cqueuetp) 若循环队列cq不空,则删去队头元素并返回元素值;否则返回空元素NULL if( cq.front=cq.rear) return(NULL); else cq.front=(cq.front+1) MOD maxsize; return(cq.elemcq.front); 6 假设以带头结点的环形链表表示队列,并且只设一个指针指向队尾元素结点(注意不设头指针),试编写相应的初始化队列、入队列、出队列的算法。解:初始化: void init_lqueue( lqueuetp lq) 设置一个空的链队列lq new(lq.front); lq.front-next:=NIL; lq.rear=lq.front; 入队列操作: PROC en_lqueue(V
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1