中缀表达式转后缀表达式的方法

    选择打赏方式

在生活中我们使用到遇到的算术式都是中缀表达式的形式就是将运算符写下中间,形如:1+2*5/8+6这种被称为中缀表达式,这种书写方式对于人来说比较好理解,但是对于计算机来说就不是那么好理解了,所以就有人发明了后缀表达式,就是将运算符写在数字后面,形如:5 6 + 7 8 * +这种就被称为后缀表达式,那这个后缀表达式对应的中缀表达式是什么呢?5+9+7*8就是这个,当然有后缀,中缀,那么自然就有前缀,但是前缀的话我们不常用,在编程当中经常使用的是后缀表达式,那么是不是每一次计算都需要我们写出后缀表达式呢,应该就是这样的,不过这样每一次都写,太麻烦了,并且不是每一个人都会写,那么就有一位著名的科学家提出了中缀表达式转后缀表达式的方法,具体方法如下:

1.先了解运算符的优先级, (左括号 低于 ±加减 低于 */ 乘除 【加减为同级,乘除为同级】
2.需要用到一个栈用来存储运算符
3.对于一个中缀表达式,读取有如下规则:
(1)从中缀表达式开头向后读
(2)遇到数字直接输出
(3)若遇到左括号,则将其压栈
(4)若遇到右括号,这时需将栈顶的运算符依次弹出并输出,直至遇到左括号(即将右括号,左括号之间的运算符按栈弹出的顺序全部输出,但左右括号不输出,直接删除即可)
(5)若遇到的是运算符:a、如果该运算符的优先级大于栈顶运算符的优先级时,将其压栈
b、如果该运算符的优先级小于或等于栈顶运算符的优先级时,将栈顶运算符弹出并输出,接着和新的栈顶运算符比较,若大于,则将其压栈,若小于等于,继续将栈顶运算符弹出并输出…(一直递归下去,直至运算符大于栈顶运算符为止)。//请一定要耐心读完并掌握规则☺☺
(6) 若扫描到中缀表达式的末尾,这时直接将栈中元素全部弹出(栈还有运算符的话)

代码实现

package com.wyp;

import java.util.Stack;

public class TestStack {

    private String testString = null;
    private Stack<Character> stack = null;

    /**
     * @author 1877751412
     * */
    public TestStack(String testString) {
        this.testString = testString;
        this.stack = new Stack<Character>();
    }

    private void analysisString() {
        for (int i = 0; i < testString.length(); i++) {
            char c = testString.charAt(i);
            if (c == '+' || c == '-') {
                if (stack.isEmpty() || stack.peek() == '(') {
                    stack.push(c);
                } else {
                    while (!stack.isEmpty()
                            && (stack.peek() == '*' || stack.peek() == '/'
                                    || stack.peek() == '+' || stack.peek() == '-')) {
                        System.out.print(stack.pop());
                    }
                    stack.push(c);
                }
            } else if (c == '*' || c == '/') {
                if (stack.isEmpty() || stack.peek() == '+'
                        || stack.peek() == '-' || stack.peek() == '(') {
                    stack.push(c);
                } else {
                    while (!stack.isEmpty()
                            && (stack.peek() == '/' || stack.peek() == '*')) {
                        System.out.print(stack.pop());
                    }
                    stack.push(c);
                }
            } else if (c == '(') {
                stack.push(c);
            } else if (c == ')') {
                char temp = ' ';
                while ((temp = stack.pop()) != '(') {
                    System.out.print(temp);
                }
            } else {
                System.out.print(c);
            }
        }
        if (!stack.isEmpty()) {
            while (!stack.isEmpty()) {
                System.out.print(stack.pop());
            }
        }
    }

    public static void main(String[] args) {
        TestStack testStacknew = new TestStack("A+B*(C-D)/E+F/H");
        testStacknew.analysisString();
    }

}
版权声明:若无特殊注明,本文为《若离风》原创,转载请保留文章出处。
本文链接:https://www.rlfit.cn/post-58.html
正文到此结束

热门推荐

发表吐槽

你肿么看?

你还可以输入 250 / 250 个字

嘻嘻 大笑 可怜 吃惊 害羞 调皮 鄙视 示爱 大哭 开心 偷笑 嘘 奸笑 委屈 抱抱 愤怒 思考 日了狗 胜利 不高兴 阴险 乖 酷 滑稽

评论信息框
可使用QQ号实时获取昵称+头像

私密评论

吃奶的力气提交吐槽中...


既然没有吐槽,那就赶紧抢沙发吧!