题目
所谓后缀表达式是指这样的一个表达式:式中不再引用括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。
如:3*(5–2)+7对应的后缀表达式为:3.5.2.-*7.+@。’@’为表达式的结束符号。‘.’为操作数的结束符号。
题解
虽然个人感觉写的仍是纯模拟,但是还是冠冕堂皇地骗自己:窝用的是栈!(~、~)
其实还是模拟。1 2 3 4 5 6
分六种情况,数字 . - * + /
一一判断,是数字就把数字压入栈顶,是符号就把栈顶的两个数字取出,运算后的结果再压入栈顶。
最后输出a[1]
代码
var
s:ansistring;
a:array[1..1000]of longint;
i,j,k,t,x,y,ans:longint;
begin
readln(s);
i:=1;
repeat
if (s[i]>='0')and(s[i]<='9') then x:=x*10+ord(s[i])-48;
if s[i]='.' then begin inc(t);a[t]:=x;x:=0;end;
if s[i]='-' then begin dec(t);a[t]:=a[t]-a[t+1];end;
if s[i]='*' then begin dec(t);a[t]:=a[t]*a[t+1];end;
if s[i]='+' then begin dec(t);a[t]:=a[t]+a[t+1];end;
if s[i]='/' then begin dec(t);a[t]:=a[t] div a[t+1];end;
inc(i);
until s[i]='@';
writeln(a[1]);
end.