zoukankan      html  css  js  c++  java
  • 栈的后缀表达式求值

    一,什么是后缀表达式?

    1) 对人类而言,中缀表达式符合人们的习惯。比如: 3 4 + 5 × 6 -

    2) 对于计算机而言,计算后缀表达式要比计算中缀表达式更容易。比如后缀表达式:6523+8*+3+*

    因为,计算机计算中缀表达式需要考虑优先级、括号。而计算后缀表达式只需要一个栈即可。

    计算机计算后缀表达式的过程如下----后缀表达式的计算机求值:
    从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次栈顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。
    例如后缀表达式“34+5*6-”:
    (1) 从左至右扫描,将3和4压入堆栈;
    (2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;
    (3) 将5入栈;
    (4) 接下来是×运算符,因此弹出5和7,计算出7*5=35,将35入栈;
    (5) 将6入栈;
    (6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

    另外可参考:

    后缀表达式求值的代码如下:

     1 import java.util.LinkedList;
     2 
     3 public class PostfixValue {
     4     public static void main(String[] args) {
     5         int r = postfixValue("34+5*6-");
     6         System.out.println(r);
     7     }
     8     
     9     //postfix 表示后缀表达式字符串
    10     public static int postfixValue(String postfix){
    11         LinkedList<Integer> postList = new LinkedList<>();//模拟栈的功能
    12         Character nextChar;
    13         int leftOperator, rightOperator;
    14         
    15         for(int i = 0; i < postfix.length(); i++)
    16         {
    17             nextChar = postfix.charAt(i);
    18             if(nextChar >= '0' && nextChar <= '9')//如果是操作数
    19                 postList.push(nextChar - '0');
    20             else//如果是运算符
    21             {
    22                 rightOperator = postList.pop();
    23                 leftOperator = postList.pop();
    24                 switch (nextChar) {
    25                 case '+':
    26                     postList.push(leftOperator + rightOperator);
    27                     break;
    28                 case '-':
    29                     postList.push(leftOperator - rightOperator);
    30                     break;
    31                 case '*':
    32                     postList.push(leftOperator * rightOperator);
    33                     break;
    34                 case '/':
    35                     postList.push(leftOperator / rightOperator);
    36                     break;
    37                 default:
    38                     break;
    39                 }
    40             }
    41         }
    42         return postList.pop();
    43     }
    44 }

    参考: 栈的应用之中缀表达式转后缀表达式

  • 相关阅读:
    SharePoint 2013 APP 开发示例 (六)服务端跨域访问 Web Service (REST API)
    麦咖啡导致电脑不能上网
    SharePoint 2013 Central Admin 不能打开
    SharePoint 2013 APP 开发示例 (五)跨域访问 Web Service (REST API)
    SharePoint 2013 APP 开发示例 系列
    synthesize(合成) keyword in IOS
    Git Cmd
    简单的正则匹配
    Dropbox
    SQL Server Replication
  • 原文地址:https://www.cnblogs.com/hapjin/p/5374268.html
Copyright © 2011-2022 走看看