2014-04-07 178 views
1

這裏的問題是:評估前綴表達式

「的表達是當運營商的操作數前書面前綴形式 這裏有前綴表達式的一些例子和價值觀,他們評價到:

 Expression____________________Value_ 
     12       12 
     + 2 51      53 
     * 5 7      35 
     * + 16 4  + 3 1  80 

以整數開頭的表達式(如12)是一個前綴表達式,其值爲自身,否則表達式爲前綴表達式,前提是前綴表達式以前面的運算符開始,後面跟着兩個前綴表達式在後一種情況下,表達式的值是從它的constituen的值中遞歸地計算出來的t前綴子表達式。

編寫一個程序,允許用戶在文本字段中輸入前綴表達式。該程序讀取表達式,對其進行評估,並將該值顯示在合適的GUI組件中。假設用戶輸入只使用正整數和兩個運算符+和*的表達式。你的程序應該使用堆棧來存儲子表達式的值,因爲它們是被計算出來的,而另一個堆棧來存儲那些還沒有被應用的操作符。「

我看不出反正用棧來解決它的問題另一個用於表達式,但是使用一個堆棧解決這個問題非常簡單,只需要一個堆棧就可以解決這個問題。

+8

那麼,你的問題是什麼? –

+0

你如何解決這個問題?我一直在嘗試幾個小時...... – SteveDeFacto

+0

向我們展示你到目前爲止嘗試過什麼,我們可以指導你。 –

回答

0

它叫做Polish (or prefix) Notation,你可以找到很多的例子(同樣適用於Reverse Polish Notation,它非常相似)和在線計算器例如http://prefix-calc.appspot.com/

+0

對,但是你如何用兩個堆棧來完成,比如我發佈的任務? – SteveDeFacto

+0

@SteveDeFacto試試這個http://pastebin.com/qZysWP3N,希望你能從這段代碼中提取任何符合你需求的東西。 – boor

1

一種解決方案是從字符串的末尾開始,並將操作數放入堆棧中。每當遇到操作符時,彈出最後一個tw整型,應用操作符並再次推入堆棧。

import java.util.ArrayDeque; 
import java.util.Deque; 

public class PrefixEvaluator { 

    public static void main(String[] args) { 
     String[] prefixStr = "* + 16 4  + 3 1 ".split(" "); 
     Deque<Integer> stack = new ArrayDeque<>(); 
     for(int i=prefixStr.length-1;i>-1;i--){ 
      String s = prefixStr[i]; 
      if(s.equals("")){ 
       continue; 
      } 
      if(s.equals("+")){ 
       stack.push(stack.poll()+stack.poll()); 
      }else if(s.equals("*")){ 
       stack.push(stack.poll() * stack.poll()); 
      }else{ 
       stack.push(Integer.parseInt(s)); 
      } 
     } 
     System.out.println(stack.poll()); 
    } 

}