ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:19.64KB ,
资源ID:6615983      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6615983.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(习题三和上机答案上课讲义.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

习题三和上机答案上课讲义.docx

1、习题三和上机答案上课讲义习题三和上机答案习题三3.1 设将整数 a,b,c,d 依次进栈,但只要出栈时栈非空,则可将出栈操作按 任何次序夹入其中,请回答下述问题:(1)若执行以下操作序列 Push(a), Pop(),Push(b),Push(c), Pop(), Pop( ),Push(d), Pop( ),则出栈的数字序列为何(这里Push(i)表示i进栈,Pop()表示出栈)?能否得到出栈序列adbc和adcb并说明为什么不能得到或者如何 得到。(3)请分析 a, b , c , d 的所有排列中,哪些序列是可以通过相应的 入出栈操作得到的。解:( 1)acbd( 2)执行以下操作序列

2、Push(a), Pop(),Push(b),Push(c), Push(d),Pop(), Pop( ), Pop( )就可以得到 adcb栈的特点是“后进先出”,所以不可能得到 adbc(3) Push(a), Push(b),Push(c), Push(d),Pop(), Pop( ), Pop( ) ,Po|可)以得到 dcba Push(a), Push(b),Push(c), Pop(), Pop( ), Pop( ) , Push(d),Po|可)以得到 cbad Push(a), Push(b), Pop(),Pop( ), Push(c), Pop( ) , Push(d),

3、 Po可)以得到 bacd Push(a), Push(b), Pop(), Pop( ), Push(c),Push(d), Pop( ) , Po可)以得到 badc Push(a), Pop(),Push(b),Push(c),Push(d), Pop( ), Pop( ) , Po可)以得到 adcb Push(a), Pop(),Push(b),Push(c), Pop( ), Pop( ) , Push(d), Po|可)以得到 acbd Push(a), Pop(),Push(b), Pop( ), Push(c), Pop( ) , Push(d), Po可)以得到 abcdP

4、ush(a), Pop(),Push(b), Pop( ), Push(c), Push(d), Pop( ) , Po可()以得到 abdc3.2分别借助顺序栈和链栈,将单链表倒置。解:顺序表:#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

5、*sq,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);/* 主函数 */v

6、oid main() 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 l

7、s;datatype ch;InitStack(ls);for (ch=A;chdata); printf(n);while(!EmptyStack(ls) Pop(&ls,&ch);printf(%c,ch); printf(n);3.3有两个栈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-

8、datanext-data) 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

9、-next) t=n-next; n-next=t-next; t-next=s-next; s-next=t;s=t;free(m);free(n);return h;3. 4设两个栈共享一个数组空间,其类型定义见3.1.2节,试写出两个栈公用 的读栈顶元算法 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,用以

10、指示栈号。 解:读栈顶元函数elemtp 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 ” );elses.top+; 栈顶指针加 1s.elems.top=x x 进栈出栈函数elemtp pop_sqstack(sqstacktp s)若栈s不空,则删去栈顶元素并返回元素值

11、,否则返回空元素 NULLif(s.top=0)return(null);elses.top-; 栈顶指针减 1teturn(s.elems.top+1); 返回原栈顶元素值3. 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 ” );elsecq.rear=(cq.rear+1) MOD maxsize;cq.elemcq.rear=x出队列函数elemtp dl_cqueue(VAR cq:cqueuetp)若循环队列 cq 不空,则删去队头元素并返回元素值;否则返回空元素NULLif( cq.front=cq.rear) return(NULL);elsecq.front=(cq.front+1) MOD maxsize; return(cq.elemcq.fro

13、nt);3. 6假设以带头结点的环形链表表示队列,并且只设一个指针指向队尾元素结 点(注意不设头指针),试编写相应的初始化队列、入队列、出队列的算法。 解:初始化:void init_lqueue( lqueuetp lq)设置一个空的链队列 lqnew(lq.front); lq.front-next:=NIL;lq.rear=lq.front;入队列操作:PROC en_lqueue(VAR lq:lqueuetp;x:elemtp);在链队列lq中,插入x为新的队尾元素BEGINnew(s); st .data:=x;st .next:=NIL; Iq.rear t .next:=s;l

14、q.rear:=sENDP; en_Iqueue出队列操作:eIemtp dI_Iqueue(Iqueuetp Iq)若链队列 Iq 不空,则删去队头元素并返回元素值;否则返回空元素 NULLif(Iq.front=Iq.rear)return(nuII);eIsep=Iq.front-next;Iq.front-next=p-next;IF (p-next=NIL)Iq.rear=Iq.front;当链队列中仅有一个结点时,出队时还需修改尾指针x=p-data;dispose(p);return(x)第三章上机内容1、设单链表中存放 n 个字符 ,设计一个算法 ,使用栈判断该字符串是否中心对

15、称如abccba即为中心对称字符串.(根据题目填空完善程序)提示:先用create()函数从用户输入的字符串创建相应的单链表,然后调用 bj()函数判断是否为中心对称字符串。在 bj ()函数中先将字符串进栈,然后将栈中的字符逐个与单链表中字符进行比较。#incIude #incIude #define MaxLen 100typedef struct nodechar datastruct node *n ext;cnode;cnode *create (char s)int 1=0;cnode *h, *p, *r ;while (sl!= 0)p=(c node *)malloc(siz

16、eof(c no de);p-data=sI; p-next=NULL ;if (I= =0)h=p;r=p ; /*r始终指向最后一个结点*/elser-next=p ; r=p;I+ ;return h;int judge(c node *h)char stMaxLe n;int top=0 ;cnode *p=h;while (p!=NULL)sttop=p-data;top+;p=p-n ext;p=h;while (p!=NULL)top-;if (p-data= =sttop)p=p-n ext;elsebreak;if (p= =NULL)return 1 ;elsereturn

17、 0 ;void mai n()char strmaxle n;cnode *h;printf (输入一个字符串:”);scanf ( %c”str);h=create( str )if (judge(h)= = 1)printf( “是中心对称字符串n” ;elseprintf ( “st不是中心对称字符串n” ;输入一个字符串:abccba输出: str是中心对称字符串2、设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一 个算法判断其中的括号是否匹配。提示:本题使用一个运算符栈st,当遇到的(、或时进栈,当遇到、 、)时判断栈顶是否为相应的括号,若是退栈继续执行;否则算法

18、结束。解:#include stdio.h#include string.h#defi ne NULL 0typedef struct list char str;struct list *n ext; list;void push(char,list *);int pop(char,list *);void deal(char *str);main (void) char str20;prin tf(nln put a sua nshi:n);gets(str);deal(str);prin tf(Right!);getch();return 0;void deal(char *str) l

19、ist *L;L=(list *) malloc (sizeof(list);if(!L) printf(Error!);exit(-2);L-next=NULL;while(*str) if(*str=(|*str=|*str=) push(*str,L);else if(*str=)|*str=|*str=) if(pop(*str,L) puts(Error!Check it.); puts(Press Enter to exit.); getchar();exit(-2);str+;if(L-next) puts(Error!Check it.);puts(Press any key

20、to exit.);getchar();exit(-2);void push(char c,list *L) list *p;p=(list *) malloc (sizeof(list);if(!p) printf(Error!);exit(-2);p-str=c;p-next=L-next;L-next=p;#define CHECK(s) if(L-next-str=s) p=L-next; L-next=p-next; free(p); return 0;int pop(char c,list *L) list *p;if(L-next=NULL) return 1;switch(c)

21、 case ):CHECK() break;case :CHECK() break; case :CHECK() break; return 1;3、设计一个程序,演示用算符优先法对算术表达式求值的过程。 基本要求:以字符序列的形式从终端输入语法正确的、不含变量的整数表达 式。利用教科书表 3.1 给出的算符优先关系,实现对算术四则混合运算表达式 的求值,并仿照教科书的例 3_1 演示在求值中运算符栈、运算数栈、输入字符 和主要操作的变化过程。测试数据: 3* (7-2)解:#include stdio.h#include string.h#define NULL 0typedef struc

22、t list int infor; struct list *next;list;int operand(int d8,char *s);list *creat(void);list *creat(void);void push(list *,int);int pop(list *);int operate(int,int,int);int check(int,int,int d8);main(void) int d88=-2,43,45,42,47,40,41,35,43,1,1 ,-1,-1,-1,1 , 1,45,1,1 ,-1,-1,-1,1 , 1,42,1,1 , 1, 1,-1,

23、1 , 1,47,1,1 , 1, 1,-1,1 , 1,40,-1,-1,-1,-1,-1,0 ,-2,41, 1, 1, 1, 1,-2,1 , 1, 35,-1,-1,-1,-1,-1,-2, 0 ; char a20,*s=a; printf(nInput the expressionn); gets(s); while(*s!=0) s+; *s=#; printf(The result is %d.n,operand(d,a); getch(); return 0;int operand(int d88,char *s) list *tr,*nd;int c,a,b,theta;

24、tr=creat(); nd=creat(); push(tr,#); c=*s+;while(c!=#|tr-next-infor!=#) if(c=0&cnext-infor,c,d) case -1: push(tr,c); c=*s+; break; case 0 : pop(tr);c=*s+; break; case 1 : theta=pop(tr); b=pop(nd); a=pop(nd); push(nd,operate(a,b,theta); break;return nd-next-infor;list *creat(void) list *p;p=(list *) m

25、alloc (sizeof(list);if(!p) exit(-2); p-next=NULL; return p;void push(list *L,int c) list *p;p=(list *) malloc (sizeof(list);if(!p) exit(-2);p-infor=c;p-next=L-next;L-next=p;int pop(list *L) list *p;int c;p=L-next;c=p-infor;L-next=p-next;free(p);return c;int operate(int a,int b,int theta) int result;switch(theta) case +: result=a+b;break;case -: result=a-b;break;case *: result=a*b;break;case /: result=a/b;break;return result;int check(int top,int c,int d88) int i,j;for(i=1;i8;i+) if(top=di0)exit(0); for(j=1;j8;j+) if(c=d0j) if(dij!=-2) return dij; else printf(Error!); getchar();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1