中缀表达式转化成后缀表达式

来源:互联网 发布:mac有线网络设置 编辑:程序博客网 时间:2024/06/05 20:45
package test;/*设立一个栈,存放运算符,首先栈为空,编译程序从左到右扫描中缀表达式,若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;若遇到运算符,则必须与栈顶比较,运算符级别比栈顶级别高则进栈,否则退出栈顶所有元素并输出,然后输出一个空格作分隔符;若遇到左括号,进栈;若遇到右括号,则一直退栈输出,直到退到左括号止。当栈变成空时,输出的结果即为后缀表达式。10以内的数学表达式*/import java.util.Stack;public class StackTest {    private String endExpression;    private Stack<Character> stack;    public StackTest(){        this.endExpression = "";        this.stack = new Stack<Character>();    }    public String endExp(String content){        //循环遍历字符串        for(int i=0; i < content.length(); i++){            char ch = content.charAt(i);            //若遇到操作数,直接输出,并输出一个空格作为两个操作数的分隔符;            if(ch >= '0' && ch <= '9'){                this.endExpression += ch + " ";            }            //switch中continue和break有什么区别?            switch (ch) {            //若遇到左括号,进栈            case '(':{                this.stack.push(ch);                break;            }            //若遇到右括号,则一直退栈输出,直到退到左括号止。            case ')':{                while(!this.stack.isEmpty() && !(this.stack.peek() == '(')){                    this.endExpression += this.stack.pop() + " ";                }                //去掉(括号                this.stack.pop();                break;            }            case '*':            case '/':{                //若遇到运算符,则必须与栈顶比较,运算符级别比栈顶级别高则进栈                if(this.stack.isEmpty() || this.stack.peek() == '(' || this.stack.peek() == '+' || this.stack.peek() == '-'){                    stack.push(ch);                }                break;            }            case '+':            case '-':{                //+—优先级最低,所以所有运算符出栈                while(!this.stack.isEmpty() && !(this.stack.peek() == '(')){                    this.endExpression += this.stack.pop() + " ";                }                //将最后运算符入栈                if(this.stack.isEmpty() || this.stack.peek() == '('){                    this.stack.push(ch);                }                break;            }            default:                break;            }        }        //当栈变成空时,输出的结果即为后缀表达式。        while(!this.stack.isEmpty()){            this.endExpression += this.stack.pop() + " ";        }        return this.endExpression;    }    public static void main(String[] args){        String  s = "1+2*3-4";        StackTest st = new StackTest();        String result = st.endExp(s);        System.out.println(result);    }}

PS:+、-运算符优先级最低,所有运算符出栈
代码过于拙劣,未加错误提示信息,仅支持10以内表达式,望各位大大多多指教,批评指正。
刚在CSDN看到一句话,和大家共勉:
编程中最没用的东西是源代码,最有用的东西是算法和数据结构。

0 0
原创粉丝点击