2014-04-07 274 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()); 
    } 

}