回 帖 发 新 帖 刷新版面

主题:请教一下一般算术表达式转化为中序表达式的方法。+分

如题,谢谢大家!

回复列表 (共2个回复)

沙发

??什么阿
一般算术表达式不就是中序嘛。。。。。。
是不是转成后序或前序阿
这个编程我觉得有难度,特别是加入括号的话
我是这样的
用回溯
先在整个字符串里找到第一个最最优先的运算符,以此为标准,把字符串分为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.

板凳

哦对了,我没考虑括号
还有如果中序转前序的话, 只要把他们的顺序换一换就行了,自己摸索把
      spe(s,l,k-1);
      spe(s,k+1,r);
      write(s[k]);
顺便说一句VIJOS的提交系统和usaco的不能比阿。。。。。。

我来回复

您尚未登录,请登录后再回复。点此登录或注册