1 / 14

r-f+1

r-f+1. f. r. (r-f+m) mod m. 6. 7. 6. 7. 5. 8. 5. 8. 4. 1. f. 4. 1. f. r. 3. 2. r. 3. 2. r 与 f 所有时刻表示实际的下标. 表达式变换. 栈的应用之一. (25+8)*(4*(4+7)+7). 25 8 + 4 4 7 + * 7 + *. 思考?. 请你编程实现??. 1 23 +. begin read(a,b,ch) end. 用 pascal 求后缀表达式的值。

analu
Download Presentation

r-f+1

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. r-f+1 f r

  2. (r-f+m) mod m 6 7 6 7 5 8 5 8 4 1 f 4 1 f r 3 2 r 3 2 r 与f 所有时刻表示实际的下标

  3. 表达式变换 栈的应用之一

  4. (25+8)*(4*(4+7)+7) 25 8 + 4 4 7 + * 7 + * 思考? 请你编程实现?? 1 23 + begin read(a,b,ch) end.

  5. 用pascal求后缀表达式的值。 【问题描述】根据后缀算术表达式计算其值,注意相邻的数值型数据间用空格隔开,数据与运算符间也用空格隔开,表达式以@结束。计算的值保留两位小数,并对第三位四舍五入。 如35 6 +@其值输出为41。 【输入】 输入一行以@结束的表达式 【输出】结果 【样例】 输入36 57 /@ 输出0.63 ①建立一个栈,放操作数 ②从左到右读入表达式,若为数,则将它转换为数值后入栈;若为运算符,则从栈中弹出两个数计算,并将结果入栈。 ③若表达式未读完,就重复②。 ④最后栈顶的数值(栈中应只剩栈顶元素)则为结果。

  6. program track; var t1:array[1..10000] of real; top:integer; ch:char; st:string; f:boolean; x:real; begin ch:=''; top:=0; f:=false; while ch<>'@' do begin st:=''; read(ch); while (ch in ['0'..'9','.']) do begin f:=true; st:=st+ch; read(ch); end; if f then begin inc(top); val(st,x); t1[top]:=x; f:=false; end; if ch in ['+','-','*','/'] then begin case ch of '+':t1[top-1]:=t1[top-1]+t1[top]; '-':t1[top-1]:=t1[top-1]-t1[top]; '*':t1[top-1]:=t1[top-1]*t1[top]; '/':t1[top-1]:=t1[top-1] / t1[top]; end; dec(top); end; end; write(round(t1[1]*100)/100:0:2); end. 16 4.5 + 5 /@ 25 8 + 4 4 7 + * 7 + *@

  7. 栈的应用二 程序员输入问题:程序员输入程序,出现差错时可以采取以下的补救措施:敲错了一个键时,可以补敲一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以敲入一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。 如:在终端上输入了这样两行字符 PRKJ##OGRAN#MLX; VAR@CONSTN:#=10; 则实际有效的是: PROGRAMLX; CONSTN=10;

  8. 【分析】通过栈操作模拟程序员的输入过程; 逐行处理,处理完一行以后输出结果,栈置空; 某行内逐字读入数据,对每个读入的字符进行如下操作: 既不是退格符#也不是退行符@,则将该字符插入栈顶; 是退格符#,则从栈顶删去一个字符; 是退行符@ ,就把字符栈清为空栈。 PRKJ##OGRAN#MLX; VAR@CONSTN:#=10; PROGRAMLX; CONSTN=10;

  9. {栈} {栈指针} PRKJ##OGRAN#MLX; VAR@CONSTN:#=10; type stack=array[1..100] of char; var s:stack; top:0..100; ch:char; i:integer; procedure setnull(var s:stack); {置栈为空} begin top:=0 end; procedure pop(var s:stack); {出栈} begin if top=0 then writeln(‘underflow’) else top:=top -1;end; procedure push(var s:stack;x:char); {入栈} begin if top=100 then writeln(‘overflow’) else begin top:=top+1;s[top]:=x; end; end; begin{主程序} while not eof do begin setnull(s); while not eoln do begin read(ch); case ch of ‘#’:pop(s); ‘@’:setnull(s) else push(s,ch) end; end; for i:=1 to top do write(s[i]); writeln; read(ch); end ; end. {eof函数,判断文件是否结束} {置栈为空} {eoln函数,判断一行是否结束} Ord(ch)<>13

  10. 2010tgdx1.元素R1、R2、R3、R4、R5入栈的顺序为R1、R2、R3、R4、R5。如果第1个出栈的是R3,那么第5个出栈的可能是(ACD )。A.R1         B.R2         C.R4         D.R5 • 2008tg6.设栈S的初始状态为空,元素a,b,c,d,e,f依次入栈,出栈顺序为b,d,c,f,e,a那么栈容量至少应该是(D)。A.6 B.5 C.4 D.3 E.2 • 3. 2007tg 7. 地面上有标号为A、B、C的3根细柱, 在A柱上放有10个直径相同中间有孔的圆盘, 从上到下次依次编号为1, 2, 3, ……,将A柱上的部分盘子经过B柱移入C柱, 也可以在B柱上暂存。如果B柱上的操作记录为:“进,进,出,进,进,出,出,进,进,出,进,出,出”。那么, 在C柱上, 从下到上的盘子的编号为( D )。A. 2 4 3 6 5 7 B. 2 4 1 2 5 7 C. 2 4 3 1 7 6 • D. 2 4 3 6 7 5 E. 2 1 4 3 7 5

  11. (8tg)设栈S和队列Q的初始状态为空,元素e1,e2,e3,e4,e5,e6依次通过钱S,一个元素出栈后即进入队列Q,若出队的顺序为e2,e4,e3,e6,e5,e1,则钱S的容量至少应该为( ) 。A) 2 B) 3 C) 4 D) 5 (9tg_多项)已知元素(8,25,14,87,5l,90,6,19,20),问这些元素以怎样的顺序进入栈,才能使出栈的顺序满足:8在5l前面;90在87后面;20在14后面;25在6前面;19在90后面。 ( ) A)20,6,8,51,90,25,14,19,87 B)51,6,19,20,14,8,87,90,25 C)19,20,90,7,6,25,5l,14,87 D)6,25,51,8,20,19,90,87,14 E)25,6,8,51,87,90,19,14,20 (13tg)地面上有标号为A、B、C的三根柱,在A柱上放有10个直径相同中间有孔的圆盘,从上到下依次编号为1,2,3……,将A柱上的部分盘子经过B柱移入C柱,也可以在B柱上暂存。如果B柱上的操作记录为“进、进、出、进、进、出、出、进、进、出、进、出、出”。那么,在C柱上,从下到上的编号为( )。 A.2 4 3 6 5 7 B.2 4 1 2 5 7 C.2 4 3 1 7 6 D.2 4 3 6 7 5 历届初比赛题(选) B D D

  12. (11tg_多项)设栈S的初始状态为空,元素a, b, c, d, e, f, g依次入栈,以下出栈序列不可能出现的有( )。 A. a, b, c, e, d, f, g B. b, c, a, f, e, g, d C. a, e, c, b, d, f, g D. d, c, f, e, b, a, g E. g, e, f, d, c, b, a (12tg_多项)设栈S的初始状态为空,元素a, b, c, d, e 依次入栈,以下出栈序列不可能出现的有( )。 A. a, b, c, e, d B. b, c, a, e, d C. a, e, c, b, d D. d, c, e, b, a (12tg ) 某个车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时刻该车站状态为空,从这一时刻开始的出入记录为:“进,出,进,进,进,出,出,进,进,进,出,出”。假设车辆入站的顺序为1,2,3,……,则车辆出站的顺序为( )。 A. 1, 2, 3, 4, 5 B. 1, 2, 4, 5, 7 C. 1, 4, 3, 7, 6 D. 1, 4, 3, 7, 2 E. 1, 4, 3, 7, 5 C E C C 有一定规律,分段有序

  13. 将中缀表达式转化为后缀表达式的算法:   要将中缀表达式转化为等价的后缀表达式,须从左至右扫描中缀表达式,并用一个栈存放中缀表达式的“(”和暂时不能参与计算的运算符。 • 当读到数字直接送至后缀表达式中 • 当读到运算符t时,a.将栈中所有优先级高于或等于t的运算符弹出,送到后缀表达式中; b.t进栈 • 读到左括号时总是将它压入栈中 • 读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至后缀表达式后,再丢弃左括号。 • 中缀表达式读完后,若栈中还有运算符,则将栈中运算符全部依次弹出,送至后缀表达式。

  14. 输出队列 中缀转后缀过程 6 9 4 3 + * - 5 + # 6 9 4 3 +*-5 + 6-9*(4+3)+5# 如果运算优先级大于栈顶元素直接进栈 如果运算优先级小于或等于栈顶元素,则先弹出栈顶元素,再进栈 左括号直接进栈 右括号则依次弹出栈中的元素,直到遇到第一个左括号为止。 + 1 ( 0 * 2 - 1 + 1 + 1 # -1

More Related