• 算术表达式转换为后缀表达式


     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 }
  • 相关阅读:
    JavaScript继承详解 转
    Chinese Consumer and Websites
    【转载】C#防SQL注入过滤危险字符信息
    记一次在数据库中查询:“包含”或者“仅包含”某些商品的订单的方法
    IE 6 position: relative + li 问题
    【转】c# 位操作
    基于asp.net MVC的无刷新文件上传
    C++ 类继承内存布局
    美杜杉 主动防御最新版
    [转]COM 连接点
  • 原文地址:https://www.cnblogs.com/xurui1995/p/5183182.html
Copyright © 2020-2023  润新知