例如:有字符串算式'5*6+3.5',如何得到这个字符串算式的值

解决方案 »

  1.   

    可以用堆栈转换成后缀表达式然后计算。当然网上有许多现成的控件代码的,比如Expression Parser http://www.2ccc.com/article.asp?articleid=2057
      

  2.   

    将中缀表达式转换为后缀表达式的算法思想:
      ·当读到数字直接送至输出队列中
      ·当读到运算符t时,
         a.将栈中所有优先级高于或等于t的运算符弹出,送到输出队列中;
         b.t进栈
      ·读到左括号时总是将它压入栈中
      ·读到右括号时,将靠近栈顶的第一个左括号上面的运算符全部依次弹出,送至输出队列后,再丢弃左括号。
      

  3.   

    //老早写的一个程序,希望对你有帮助
    //表达式的计算——中缀表达式改为后缀表达式
    const
        smaxsize=100;
    type
    selement=char;
    sposition=0..smaxsize;
    stack=record
      data:array[1..smaxsize]of selement;
      top:sposition;
        end;
    var
      s:stack;
      strin,strout:string;procedure screat(var s:stack);
    begin
      s.top:=0;
    end;function sempty(var s:stack):boolean;
    begin
      if s.top=0 then sempty:=true
      else sempty:=false;
    end;function sfull(var s:stack):boolean;
    begin
      if s.top=smaxsize then sfull:=true
      else sfull:=false;
    end;procedure spush(e:selement;var s:stack);
    begin
      inc(s.top);
      s.data[s.top]:=e;
    end;procedure spop(var e:selement;var s:stack);
    begin
      e:=s.data[s.top];
      dec(s.top);
    end;procedure stop(var e:selement;var s:stack);
    begin
      e:=s.data[s.top];
    end;function first(t:selement):integer;
    begin
    case t of
    '(':first:=0;
    '+','-':first:=1;
    '*','/':first:=2;
    end;
    end;procedure change(strin:string;var strout:string;var s:stack);
    var
    t:selement;
    md,me,mt:set of selement;
    i,j:integer;
    begin
    md:=['0'..'9',' ',';'];me:=['+','-','*','/','(',')'];
    mt:=md+me;
    strin:=strin+';';
    spush('(',s);
    for i:=1 to length(strin) do
    case strin of
    '0'..'9':strout:=strout+strin;
    '(':spush(strin,s);
    ')',';':repeat
    spop(t,s);
    if t<>'(' then
    strout:=strout+t;
    until (t='(')or(sempty(s));
    '+','-','*','/':begin
    stop(t,s);
    while first(strin)<=first(t) do
    begin
    spop(t,s);
    strout:=strout+t;
    stop(t,s);
    end;
    spush(strin,s);
    end;
    end;
    end;begin
    strout:='';
    writeln;
    writeln;
    write('enter a formual:');
    readln(strin);
    while pos(' ',strin)<>0 do delete(strin,pos(' ',strin),1);
    screat(s);
    change(strin,strout,s);
    writeln('output formual is :',strout);
    readln;
    end.