主题:请教一下一般算术表达式转化为中序表达式的方法。+分
pascaler
[专家分:150] 发布于 2006-04-03 17:46:00
如题,谢谢大家!
回复列表 (共2个回复)
沙发
贺天行宝 [专家分:2300] 发布于 2006-04-03 20:34:00
??什么阿
一般算术表达式不就是中序嘛。。。。。。
是不是转成后序或前序阿
这个编程我觉得有难度,特别是加入括号的话
我是这样的
用回溯
先在整个字符串里找到第一个最最优先的运算符,以此为标准,把字符串分为2半
再找到第一个最最优先的运算符。。。。。。
如果找不到,就直接输出了
大体是:
serch(左边)
serch(右边)
write('...');
这是我编的中序转后序,可能有问题(我还没看出来问题),看不懂的话,
注意一下EXIT和+,-,*,/的优先级
var
s:string;
i,j,k,l,m,n:longint;
procedure spe(s:string;l,r:longint);
var
i,j,k:integer;
begin
k:=1;
for k:=l to r do
if (s[k]='+')or(s[k]='-') then break;
if (s[k]='+')or(s[k]='-') then
begin
spe(s,l,k-1);
spe(s,k+1,r);
write(s[k]);
exit;
end;
for k:=l to r do
if (s[k]='*')or(s[k]='/') then break;
if (s[k]='*')or(s[k]='/') then
begin
spe(s,l,k-1);
spe(s,k+1,r);
write(s[k]);
exit;
end;
for i:=l to r do write(s[i]);
end;
begin
readln(s);
spe(s,1,length(s));
end.
板凳
贺天行宝 [专家分:2300] 发布于 2006-04-03 20:37:00
哦对了,我没考虑括号
还有如果中序转前序的话, 只要把他们的顺序换一换就行了,自己摸索把
spe(s,l,k-1);
spe(s,k+1,r);
write(s[k]);
顺便说一句VIJOS的提交系统和usaco的不能比阿。。。。。。
我来回复