zoukankan      html  css  js  c++  java
  • 算术表达式转换为后缀表达式

     1 package datastructure;
     2 
     3 public class Postfix {
     4 
     5     /**
     6      *  转为后缀表达式: 
     7      * 1、如果是"("直接压入栈。 
     8      * 2、如果是")",依次从栈弹出运算符加到postfix的末尾,直到遇到"("; 
     9      * 3、如果是运算符,比较扫描到的运算符,和栈顶的运算符。如果扫描到的运算符优先级
    10      * 高于栈顶运算符则,把运算符压入栈。否则的话,就依次把栈中运算符弹出加到postfix的末尾,
    11      * 直到遇到优先级低于扫描到的运算符或栈空,并且把扫描到的运算符压入栈中。就这样依次扫描,知道结束为止。
    12      * 如果是操作数,直接加到postfix末尾
    13      * 如果扫描结束,栈中还有元素,则依次弹出加到postfix的末尾。 
    14      */
    15     public static void main(String[] args) throws Exception {
    16         String str="a+(b-c/d)*e";//输出abcd/-e*+则正确
    17         System.out.println(convertToPostfix(str));
    18     
    19     }
    20 
    21 public static String convertToPostfix(String str) {
    22     LinkStack ls= new LinkStack();
    23     String postfix=new String();
    24     for(int i=0;i<str.length()&&str!=null;i++){
    25         char c=str.charAt(i);
    26         if(c=='(')                 //为开括号
    27             ls.push(c);
    28         else if(c==')')             //为闭括号
    29         {  
    30             char tmp=(Character) ls.pop();
    31             while(tmp!='(')
    32             {
    33                 postfix=postfix.concat(String.valueOf(tmp));
    34                 tmp=(Character) ls.pop();
    35             }
    36             
    37         }
    38         else if(isOperator(c))       //为运算符
    39         {
    40             if(!ls.isEmpty())           //判断栈中存不存在元素
    41             {
    42                  char tmp =(Character) ls.pop();
    43                 while(priority(tmp)>=priority(c)){
    44                     postfix=postfix.concat(String.valueOf(tmp));
    45                     tmp=(Character) ls.pop();
    46                 }
    47                 if(priority(tmp)<priority(c))
    48                 {
    49                     ls.push(tmp);
    50                     ls.push(c);
    51                 }
    52                 
    53                     
    54             }
    55             else                    //空栈直接push
    56             ls.push(c);
    57             
    58                 
    59         }
    60         else{                        //操作数直接输出到字符串后
    61             postfix=postfix.concat(String.valueOf(c));
    62         }
    63     }
    64     while(!ls.isEmpty())
    65         postfix=postfix.concat(String.valueOf(ls.pop()));
    66     return postfix;
    67     
    68 
    69 }
    70 
    71 public static int priority(char c) {
    72     if(c=='^')
    73         return 3;
    74     if(c=='*'||c=='/'||c=='%')
    75         return 2;
    76     if(c=='+'||c=='-')
    77         return 1;
    78     else
    79         return 0;
    80 }
    81 
    82 public static boolean isOperator(char c) {
    83     if(c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^')
    84         return true;
    85     else
    86         return false;
    87 }
    88 
    89 
    90 }
  • 相关阅读:
    并发编程学习笔记(八、volitile)
    MySQL调优学习笔记(六、SQL查询优化)
    MySQL调优学习笔记(五、高性能索引)
    MySQL调优学习笔记(四、索引)
    MySQL调优学习笔记(三、数据库优化)
    MySQL调优学习笔记(二、MySQL调优基础)
    MySQL调优学习笔记(一、MySQL基础)
    密码-简单加密
    密码-这不是摩斯密码
    密码-聪明的小羊
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5183182.html
Copyright © 2011-2022 走看看