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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值