• 140 likes • 293 Views
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 求后缀表达式的值。
E N D
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求后缀表达式的值。 【问题描述】根据后缀算术表达式计算其值,注意相邻的数值型数据间用空格隔开,数据与运算符间也用空格隔开,表达式以@结束。计算的值保留两位小数,并对第三位四舍五入。 如35 6 +@其值输出为41。 【输入】 输入一行以@结束的表达式 【输出】结果 【样例】 输入36 57 /@ 输出0.63 ①建立一个栈,放操作数 ②从左到右读入表达式,若为数,则将它转换为数值后入栈;若为运算符,则从栈中弹出两个数计算,并将结果入栈。 ③若表达式未读完,就重复②。 ④最后栈顶的数值(栈中应只剩栈顶元素)则为结果。
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 + *@
栈的应用二 程序员输入问题:程序员输入程序,出现差错时可以采取以下的补救措施:敲错了一个键时,可以补敲一个退格符“#”,以表示前一个字符无效;发现当前一行有错,可以敲入一个退行符“@”,以表示“@”与前一个换行符之间的字符全部无效。 如:在终端上输入了这样两行字符 PRKJ##OGRAN#MLX; VAR@CONSTN:#=10; 则实际有效的是: PROGRAMLX; CONSTN=10;
【分析】通过栈操作模拟程序员的输入过程; 逐行处理,处理完一行以后输出结果,栈置空; 某行内逐字读入数据,对每个读入的字符进行如下操作: 既不是退格符#也不是退行符@,则将该字符插入栈顶; 是退格符#,则从栈顶删去一个字符; 是退行符@ ,就把字符栈清为空栈。 PRKJ##OGRAN#MLX; VAR@CONSTN:#=10; PROGRAMLX; CONSTN=10;
{栈} {栈指针} 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
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
(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
(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 有一定规律,分段有序
将中缀表达式转化为后缀表达式的算法: 要将中缀表达式转化为等价的后缀表达式,须从左至右扫描中缀表达式,并用一个栈存放中缀表达式的“(”和暂时不能参与计算的运算符。 • 当读到数字直接送至后缀表达式中 • 当读到运算符t时,a.将栈中所有优先级高于或等于t的运算符弹出,送到后缀表达式中; b.t进栈 • 读到左括号时总是将它压入栈中 • 读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至后缀表达式后,再丢弃左括号。 • 中缀表达式读完后,若栈中还有运算符,则将栈中运算符全部依次弹出,送至后缀表达式。
输出队列 中缀转后缀过程 6 9 4 3 + * - 5 + # 6 9 4 3 +*-5 + 6-9*(4+3)+5# 如果运算优先级大于栈顶元素直接进栈 如果运算优先级小于或等于栈顶元素,则先弹出栈顶元素,再进栈 左括号直接进栈 右括号则依次弹出栈中的元素,直到遇到第一个左括号为止。 + 1 ( 0 * 2 - 1 + 1 + 1 # -1