2012-04-22 87 views
0

我做了這個程序來評估後綴表達式。 如果只使用單個數字號碼,它工作正常。java中使用堆棧的Postfix評估

我的問題是如果輸入有空格,我該如何推送多位數字?

ex。輸入:23 + 34 * - 輸出爲-7

但如果我輸入:23 5 +產量只有3(這是空間之前的位) 它應具有的28

我的代碼的輸出:

public class Node2 
{ 
    public long num; 
    Node2 next; 
    Node2(long el, Node2 nx){ 
     num = el; 
     next = nx; 
    } 
} 


class stackOps2 
    { 
     Node2 top; 
     stackOps2(){ 
      top = null; 
     } 

     public void push(double el){ 
      top = new Node2(el,top); 
     } 

     public double pop(){ 
      double temp = top.num; 
      top = top.next; 
      return temp; 
     } 

     public boolean isEmpty(){ 
      return top == null; 
     } 
    } 




public class ITP { 

static stackOps2 so = new stackOps2(); 
public static final String operator = "+-*/^"; 




    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     System.out.println("Enter the infix:"); 
      String s = input.next(); 
       String output; 
    InToPost theTrans = new InToPost(s); 
    output = theTrans.doTrans(); 
    System.out.println("Postfix is " + output + '\n'); 
System.out.println(output+" is evaluated as: "+evaluate(output)); 
    } 

    public static double evaluate(String value)throws NumberFormatException{ 

      for(int i=0;i<value.length();i++){ 
       char val = value.charAt(i); 
          if(Character.isDigit(value.charAt(i))){ 
        String v = ""+val; 
        so.push(Integer.parseInt(v)); 
       } 
       else if(isOperator(val)){ 
        double rand1=so.pop(); 
        double rand2=so.pop(); 
        double answer ; 
        switch(val){ 
         case '+': answer = rand2 + rand1;break; 
         case '-': answer = rand2 - rand1;break; 
         case '*': answer = rand2 * rand1;break; 
          case '^': answer = Math.pow(rand2, rand1);break; 
          default : answer = rand2/rand1;break; 
        } 
        so.push(answer); 
        } 
        else if(so.isEmpty()){ 
         throw new NumberFormatException("Stack is empty"); 
        } 
       } 
       return so.pop(); 
      } 

      public static boolean isOperator(char ch){ 
       String s = ""+ch; 
       return operator.contains(s); 
      } 

} 

回答

1

這是一個小型自包含的示例,它執行所有字符串解析和評估。與你的例子唯一的區別是,它一次接受整個字符串,而不是使用掃描器。請注意使用Integer.parseInt - 這在您的示例中缺失。我認爲你可以很容易地擴展這個爲你的需求。

@SuppressWarnings({"rawtypes", "unchecked"}) 
public static void main(String[] args) { 
    final String in = "5 9 + 2 * 6 5 * +"; 
    final Deque<Object> s = new LinkedList(); 
    for (String t : in.split(" ")) { 
    if (t.equals("+")) s.push((Integer)s.pop() + (Integer)s.pop()); 
    else if (t.equals("*")) s.push((Integer)s.pop() * (Integer)s.pop()); 
    else s.push(Integer.parseInt(t)); 
    } 
    System.out.println(s.pop()); 
} 
+0

它應該是一個堆棧,而不是一個Deque,或者你會在一端插入並讀取另一端。 – flup 2014-02-17 21:51:59