数据结构上机例题_第1页
数据结构上机例题_第2页
数据结构上机例题_第3页
数据结构上机例题_第4页
数据结构上机例题_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、栈与队列上机题讲解一、 表达式的后缀式计算(9较难)二、 回文游戏三、 地图四染色(8,选做)四、 n皇后问题(6)五、 k阶斐波那契序列(5)1 表达式 := (操作数) + (运算符) + (操作数) 操作数 := 简单变量 | 表达式 简单变量 :=标识符 | 无符号整数二元运算符的表达式的三种标识方法2 表达式的三种标识方法:设 Exp = S1 + OP + S2则称 OP + S1 + S2 为前缀表示法 S1 + OP + S2 为中缀表示法 S1 + S2 + OP 为后缀表示法 3例如: Exp = a b + (c d / e) f前缀式: 中缀式: 后缀式: 结论:1)操

2、作数之间的相对次序不变;2)运算符的相对次序不同;3)中缀式丢失了括弧信息, 致使运算的次序不确定; + a b c / d e fa b + c d / e fa b c d e / f + 45)后缀式的运算规则为: 每个运算符和在它之前出现 且紧靠它 的两个操作数构成一个最小表达式; 运算符在表达式中出现的顺序恰为表达式的运算顺序。4)前缀式的运算规则为: 连续出现的两个操作数和在它们之前且紧靠它们的运算符构成一个最小表达式;5如何从后缀式求值?先找运算符, 再找操作数例如: a b c d e / f +abd/ec-d/e(c-d/e)f6如何从原表达式求得后缀式? 每个运算符的运算

3、次序要由它之后的一个运算符来定,在后缀式中,优先数高的运算符领先于优先数低的运算符。分析 “原表达式” 和 “后缀式”中的运算符:原表达式: a + b c d / e f后缀式: a b c + d e / f 7从原表达式求得后缀式的规律为:1) 设立运算符栈;2) 设表达式的结束符为“#”, 预设运算符栈的栈底为“#”;3) 若当前字符是操作数, 则直接发送给后缀式。84) 若当前运算符的优先数高于栈顶运算符,则进栈;5) 否则,退出栈顶运算符发送给后缀式; 6) “(” 对它之前后的运算符起隔离作用,“)”可视为自相应左括弧开始的表达式的结束符。从原表达式求得后缀式的规律为:9例如:

4、Exp = a b + (c d / e) f#后缀式: Suffix =a d cf+#运算符栈b+(-e/ 10void transform(char suffix , char exp ) /从原表达式求得后缀式 /s是运算符栈,s栈底预设 #,OP是运算符集合 / CrtExptree InitStack(S); Push(S, #); p = exp; ch = *p; while (!StackEmpty(S) if (!IN(ch, OP) / 若ch是操作数 Pass( Suffix, ch); else A: / 若ch是运算符 if ( ch!= # ) p+; ch =

5、*p; else Pop(S, ch); Pass(Suffix, ch); / while 11A:switch (ch) case ( : Push(S, ch); break; case ) : Pop(S, c); while (c!= ( ) Pass( Suffix, c); Pop(S, c) break; defult : while(Gettop(S, c) & ( precede(c,ch) Pass( Suffix, c); Pop(S, c); if ( ch!= # ) Push( S, ch); break; / switch若ch的优先级比c低,为真121) 设立

6、操作数栈S;2) 设表达式的结束符为“#”;3)读入表达式一个字符,若当前字符是操作数,则压入栈中,转4)。求后缀式的值:13若当前字符是运算符optr,从栈中弹出2个数,将运算结果再压入栈,即: x2=POP(S); x1=POP(S); PUSH(S,(x1 optr x2);读下一字符,重复3)和4)直至读到结束符#; 栈顶,x=POP(S)即后缀式相应的表达式的值。14int cal(char suffix-exp ) /求后缀式表达式的值 /s是运算数栈,OP是运算符集合 /calInitStack(S); i = 0; ch = suffix-exp0;while (ch#) if

7、 (!IN(ch, OP) / 若ch是操作数 Push( S, ch); else / 若ch是运算符 x2=POP(S); x1=POP(S);/取出两个操作数 PUSH(S,(x1 ch x2); i+; ch= suffix-expi; / while15dadtop算法思路:1.读入字符串2.去掉空格(原串)3.压入栈4.原串字符与出栈字符依次比较 若不等,非回文 若直到栈空都相等,回文字符串:“madam im adam”回文游戏: 顺读与逆读字符串一样(不含空格)16int IsHuiwen( char *S) SeqStack T; int i , n; char t1; In

8、itStack( &T); n=strlen(S);/求向量长度 for ( i=0; i=0) t1=Pop (&T); / 每弹出一个字符与相应字符比较 if( t1!=Sn-i-1) return 0 ; / 不相等则返回0 i-; return 1 ; / 比较完毕均相等则返回 1 17地图四染色问题“四染色”定理是计算机科学中著名的定理之一。使地图中相邻的国家或行政区域不重色,最少可用四种颜色对地图着色。证明此定理的结论,利用栈采用回溯法对地图着色。思想:对每个行政区编号:1-7 对颜色编号;a、b、c、d;从第一号行政区开始逐一染色,每一个区域逐次用四种颜色进行试探,若所取颜色与周

9、围不重,则用栈记下来该区域的色数,否则依次用下一色数进行试探。若出现a-d均与周围发生重色,则需退栈回溯,修改当前栈顶的色数。18(1)(2)(4)(5)(6)(7)(3)R 7 7 1 2 3 4 5 6 71 2 3 4 5 6 7 1 0 0 0 0 1 00 1 1 1 1 1 01 0 1 0 1 1 01 0 1 1 0 1 01 1 0 1 1 0 01 0 0 1 1 0 00 0 0 0 0 0 01 2 3 4 5 6 7 1223414334231# 紫色 2# 黄色3# 红色4# 蓝色地图四染色举例SK19Void mapcolor(int R,int n,int s)

10、 s1=1; / 1号区域染1色 a=2; J=1; / a为区域号,J为染色号 while ( a=n) while( J=4)&(a=n) k=1; / k表示已经着色的区域号 while( ka)&(skRa-1k-1!=J) k=k+1; / 若不相邻,或若相邻且不重色,对下一个区域判断。 IF (k4) a=a-1; J=sa+1 /回溯,修改颜色 20 设n皇后问题的解为 (x1, x2, x3, ,xn), 约束条件为:其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。如何表示棋盘中放置的棋子? 由于每行、列及对角线上只能有一个棋子,因而对每列来说,只需记录该列中棋子所

11、在的行号,故用一维数组即可。皇后问题求解21 设四皇后问题的解为 (x1, x2, x3, x4), 其中: xi (i=1,2,3,4) Si=1, 2, 3, 4约束条件为:其中任意两个xi 和xj不能位于棋盘的同行、同列及同对角线。 按回溯法的定义,皇后问题求解过程为:解的初始值为空;首先添加 x1=1, 之后添加满足条件的 x2=3,由于对所有的 x31,2, 3, 4都不能找到满足约束条件的部分解(x1, x2, x3), 则回溯到部分解(x1), 重新添加满足约束条件的x2=4, 依次类推(按行存列号)。按四皇后问题求解举例2223void queen(int i, int n)

12、/ 进入本函数时,在nn棋盘前i-1行已放置了互不攻 / 击的i-1个棋子。现从第 i 行起继续为后续棋子选择 / 满足约束条件的位置。当求得(in)的一个合法布局 / 时,输出之。 if (in) 输出棋盘的当前布局; else for (j=1; j=n; +j) 在第 i 行第 j 列放置一个棋子; if (当前布局合法) queen(i+1, n); 移去第 i 行第 j 列的棋子; / trial 24#include#define n 8 / n为皇后个数,m为摆法计数int m=0,an; / ai存放第i个皇后放置的行号,int ok(int i, int j) /检查(i,j

13、)上能否放棋子 j1=j; i1=i; ok1=1; /1. 检查第i行上能否放棋子 while( (j11)&ok1) j1-; ok1=aj1!=i ; j1=j; i1=i; /2. 检查对角线上能否放棋子 while( (j11)&(i11)&ok1) j1-; i1-; ok1=aj1!=i1 ; j1=j; i1=i; /3. 检查另一对角线上能否放棋子 while( (j11)&(i1n) m+; printf(m=%d ,m); for (i=1;i=n;i+) printf( %d,ai); printf(“n”); else for( i=1; imax ,其中max为某个

14、约定的常数。(注意本题所用循环队列的容量仅为k,则在算法执行结束时,留在循环队列中的元素应是k阶斐波那契序列中的最后k项fn-k+1 , fn ) 。27f0=0 , f1=0 , , fk-2=0 , fk-1=1,fn = fn-1 + fn-2 + fn-k (n=k,k+1,)fi = fi-1 + fi-2 + fi-k fi+1 = fi + fi-1 + fi-2 + fi-k+1两式相减得: fi+1 = 2*fi - fi-k k阶斐波那契序列28void fb(int k,int max) /方法一,队列的容量为k for(i=0;i=k-2;i+) fi=0; cq.elemi=0; cq.elemk-1=1; cq.rear=k-1; n=k; while(cq.elemcq. rearmax) fn=0; for(j=0;jmax) n=n-2; else n=n-1; if (max=1) n=k;fk=1;29方法二Vo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论