翻译成ab+ab*cd+%-x/y-wz*
然后用堆栈

解决方案 »

  1.   

    给你个我以前写得计算四则表达式的类吧,
    你要是计算含有变量的式子,如你上面的那个:((a + b - (a * b) % (c + d)) / x - y + (w * z))
    你可以根据变量的值(假设a,b,c,d,x,y,w,z都等于1),构造一个新的字符串((1+1-(1*1)%(1+1)....
    没有处理取余运算,你要是真的需要,看看程序,自己添加吧,
    import java.io.*;
    import java.util.*;
    public class Suan
    {
    private static int index=-1;
    public static void main(String [] args)
    {
    System.out.println(jisuan("3*(2+3)/(0)-(1-2)*2"));
    }
    private static double jisuan(String s)
    {
    LinkedList<Token>oper=new LinkedList<Token>();
    oper.addFirst(new Token('#',-1));
    LinkedList<Double>num=new LinkedList<Double>();
    String t="";
    for(int i=0;i<s.length();i++)
    {
    if(s.charAt(i)=='(')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    oper.addFirst(new Token('(',0));
    }
    if(s.charAt(i)==')')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    while(true)
    {
    Token cur=oper.removeFirst();
    if(cur.c=='(')break;
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }
    if(s.charAt(i)=='+')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('+',1);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }
    }
    if(s.charAt(i)=='-')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('-',1);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }

    }
    if(s.charAt(i)=='*')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('*',2);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }

    }
    if(s.charAt(i)=='/')
    {
    if(t.equals("")!=true)
    {
    num.addFirst(new Double(t));
    t="";
    }
    Token tnew=new Token('/',2);
    while(true)
    {
    Token cur=oper.removeFirst();
    if(tnew.level>cur.level)
    {
    oper.addFirst(cur);
    oper.addFirst(tnew);
    break;
    }
    else
    {
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    num.addFirst(d1+d2);
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }
    }
    }

    }
    if(s.charAt(i)>='0'&&s.charAt(i)<='9'||s.charAt(i)=='.')
    t+=s.charAt(i);

    }
    if(t.equals("")!=true)
    num.addFirst(new Double(t));
    while(oper.size()>1)
    {
    Token cur=oper.removeFirst();
    double d2=num.removeFirst();
    double d1=num.removeFirst();
    if(cur.c=='+')
    {
    num.addFirst(d1+d2);
    }
    if(cur.c=='-')
    num.addFirst(d1-d2);
    if(cur.c=='*')
    num.addFirst(d1*d2);
    if(cur.c=='/')
    {
    if(d2==0)
    {
    System.out.println("除数为0");
    System.exit(1);
    }
    num.addFirst(d1/d2);
    }

    }

    return num.getFirst();

    }


    }
    class Token
    {
    public char c;
    public int level;//运算优先级 :(:0  +:1  -:1 *:2 /:2 ):3
    public Token(char c,int level)
    {
    this.c=c;
    this.level=level;

    public String toString()
    {
    return ""+c+" "+level;
    }
    }
      

  2.   

    thx.問一下,如果我要再加上 等式 的 boolean 判斷,又如何做?如 a == b
      

  3.   

    因为你的表达式是个数值的,如果要加入boolean的,那你是不是像c语言那样,false的值为0,true的值为1呢?
    如果是这样,那程序还得改一些地方:主要是词法分析的地方
      

  4.   

    我是想這樣:如果沒有 and 或 or 這樣的詞出現:((a + b - (a * b) % (c + d)) / x - y + (w * z))則返回一個值,如果出現 and 或 or ,則表示要進行 boolean ,(((a + b - (a * b) % (c + d)) / x - y + (w * z)) > 0 and (a == c))則返回一個 boolean 值怎樣的詞法分析的地方?怎樣改?