逆波兰式java

逆波兰式java

思路

从左到右遍历输入的中缀表达式,优先级*/大于+-。(最低,(不算到结果栈,设计2个栈,把输入的中缀表达式转换成字符数组,一个一个比较,经过下面的规则,最后得到了逆波式
1>遇到操作数,直接输出;
2>栈为空时,遇到运算符,入栈;
3>遇到左括号,将其入栈;
4>遇到右括号,执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出;
5>遇到其他运算符’+”-”*”/’时,弹出所有优先级大于或等于该运算符的栈顶元素(即除了 ’ ( ',然后将该运算符入栈;
6>最终将栈中的元素依次出栈,输出。

举例

a*(b+c)-d/e
结果abc+*de/-

分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序流程图

在这里插入图片描述

package com.bo.chapter02;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class InversePolish {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.next();
        List<Character> symbol = new ArrayList<>();
        List<Character> result = new ArrayList<>();
        char[] input_char = input.toCharArray();//输入的式子
        int top = -1;//栈顶指针
        for (int i = 0; i < input_char.length; i++) {
            if (input_char[i] == '+' || input_char[i] == '-') {
                if (top == -1) {//栈空
                    symbol.add(input_char[i]);
                    top++;
                } else {
                    while (top > -1 && (symbol.get(top) != '(')) {//判断优先级
                        result.add(symbol.get(top));//出符号栈到输出栈
                        symbol.remove(top);//从符号栈移除掉
                        top--;
                    }
                    symbol.add(input_char[i]);//运算符入栈,加减优先级低
                    top++;
                }
            } else if (input_char[i] == '*' || input_char[i] == '/') {
                if (top == -1) {
                    symbol.add(input_char[i]);
                    top++;
                } else {
                    while ((symbol.get(top) != '(') && (symbol.get(top) == '*' || symbol.get(top) == '/')) {//*/优先级高,碰到/*会出栈
                        result.add(symbol.get(top));//出符号栈到输出栈
                        symbol.remove(top);//从符号栈移除掉
                        top--;
                    }
                    symbol.add(input_char[i]);
                    top++;
                }
            } else if (input_char[i] == '(') {
                symbol.add(input_char[i]);
                top++;
            } else if (input_char[i] == ')') {//)只要不遇到(之前的全部入结果栈
                while (symbol.get(top) != '(') {
                    result.add(symbol.get(top));//出符号栈到输出栈
                    symbol.remove(top);//从符号栈移除掉
                    top--;
                }
                symbol.remove(top);
                top--;//(出栈但是不算

            } else {//除了上述情况之外就是字母
                result.add(input_char[i]);
            }
        }
        //把整个字符数组判断完,把符号栈的全部放到结果栈里
        while (top > -1) {
            result.add(symbol.get(top));
            symbol.remove(top);
            top--;
        }

        System.out.println("逆波兰式:" + result.toString());
    }
}


版权声明:本文为qq_46110710原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。