逆波兰式

      一个表达式E的后缀形式可以如下定义:
      (1)如果E是一个变量或常量,则E的后缀式是E本身。
      (2)如果E是E1 op E2形式的表达式,这里op是如何二元操作符,则E的后缀式为E1'E2' op,这里E1'和E2'分别为E1和E2的后缀式。
      (3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。
          如:我们平时写a+b,这是中缀表达式,写成后缀表达式就是:ab+
        (a+b)*c-(a+b)/e的后缀表达式为:
        (a+b)*c-(a+b)/e
      →((a+b)*c)((a+b)/e)-
      →((a+b)c*)((a+b)e/)-
      →(ab+c*)(ab+e/)-
      →ab+c*ab+e/-

     实现逆波兰式的算法,难度并不大,但为什么要将看似简单的中序表达式转换为复杂的逆波兰式?原因就在于这个简单是相对人类的思维结构来说的,对计算机而言中序表达式是非常复杂的结构。相对的,逆波兰式在计算机看来却是比较简单易懂的结构。因为计算机普遍采用的内存结构是栈式结构,它执行先进后出的顺序。

public class AlgTest {

private static Stack<Integer> stack = new Stack<Integer>();
public static void main(String[] args) {
      String[] tokens = new String[] { "2", "1", "+", "3", "*" };
      String[] tokens1 = new String[]{"4", "13", "5", "/", "+"};
     Integer value = polish(tokens1);
     System.out.println(value);
}
public static Integer polish(String[] tokens) {
     String operators = "+-*/";
     for (String s : tokens) {
           if (!operators.contains(s)) {
               stack.push(Integer.valueOf(s));
          } else {
              Integer a = stack.pop();
              Integer b = stack.pop();
              switch (s) {
                         case "+":
                                     stack.push(b + a);
                                     break;
                         case "-":
                                    stack.push(b - a);
                                    break;
                         case "*":
                                   stack.push(b * a);
                                   break;
                         case "/":
                                   stack.push(b / a);
                                   break;
              }
        }
     }
       return stack.pop();
     }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值