编程语言
首页 > 编程语言> > Java代码实现中缀表达式转后缀表达式

Java代码实现中缀表达式转后缀表达式

作者:互联网

中缀转后缀

思路分析:

1)初始化两个栈:运算符栈s1和中间结果栈s2

2)从左到右扫描中缀表达式

3)遇到操作数将其压入s2

4)遇到操作符时,将其与s1栈顶运算符比较优先级

​ 4.1)如果s1为空,或者栈顶元素为“(”直接将其压入运算符栈

​ 4.2)如果优先级比s1栈顶元素的优先级高,将其直接入栈

​ 4.3)如果优先级小于等于s1栈顶元素优先级,则将s1栈顶元素弹出并压入s2中,再次转到4.1与s1中新的栈顶元素比较

5)遇到括号

​ 5.1)如果是左括号“(“,直接压入s1

​ 5.2)如果是右括号”)“,则依次弹出s1栈顶元素,并压入s2,直到遇到”(“,并将这一对括号废弃

6)重复2~5步骤,直到表达式最右边

7)最后将其s1剩余运算符依次加入s2

8)依次弹出s2中元素输出结果就为后缀表达式

代码实现:

package com.cwnu.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/*
 * 中缀转后缀的算法实现
 * */
public class InfixtoSuffix {
    public static void main(String[] args) {
        //声明字符转
        String express = "1 + ( ( 2 + 3 ) * 4 ) - 5";
        //字符串转数组
        String[] expressArray = toStringArray(express);
        //初始化两个栈符号栈s1和中间栈s2
        Stack<String> s1 = new Stack<>();
        Stack<String> s2 = new Stack<>();
        s2 = suffixesToSuffixes(s1, s2, expressArray);
        String[] print = new String[s2.size()];
        for (int i = 0; i < s2.size(); i++) {
            print[i] = s2.get(i);
        }
        System.out.print("表达式为:");
        for (String e : print) {
            System.out.print(e + " ");
        }
    }

    //将字符串转化为数组
    public static String[] toStringArray(String string) {
        return string.split(" ");
    }

    //运算优先级
    public static int priority(String oper) {
        if (oper.equals("*") || oper.equals("/")) {
            return 1;
        } else if (oper.equals("+") || oper.equals("-")) {
            return 0;
        } else {
            return -1;
        }
    }

    //判断是否为运算符
    public static boolean isOperator(String oper) {
        return oper.equals("*") || oper.equals("/") || oper.equals("+") || oper.equals("-");
    }

    //判断是否为括号
    public static boolean isParentheses(String oper) {
        return oper.equals("(") || oper.equals(")");
    }

    //中缀转后缀
    public static Stack suffixesToSuffixes(Stack<String> s1, Stack<String> s2, String[] strings) {
        //对表达时进行扫描
        for (String itme : strings) {
            if (!isOperator(itme) && !isParentheses(itme)) {//表示为既不是运算符也不是括号,数字直接入s2
                s2.push(itme);
            } else if (isOperator(itme)) {//遇到运算符
                // 如果s1为空,或者栈顶元素为“(”直接将其压入运算符栈
                if (s1.isEmpty() || s1.peek().equals("(")) {
                    s1.push(itme);
                } else if (priority(itme) > priority(s1.peek())) {//如果优先级比s1栈顶元素的优先级高,将其直接入栈
                    s1.push(itme);
                } else if (priority(itme) <= priority(s1.peek())) {//如果优先级小于等于s1栈顶元素优先级,则将s1栈顶元素弹出并压入s2中,再次转到4.1与s1中新的栈顶元素比较
                    while (true) {
                        s2.push(s1.pop());
                        if (s1.isEmpty() || s1.peek().equals("(") || priority(itme) > priority(s1.peek())) {
                            s1.push(itme);
                            break;
                        }
                    }
                }
            } else if (isParentheses(itme)) {
                // 5.1)如果是左括号“(“,直接压入s1
                if (itme.equals("(")) {
                    s1.push(itme);
                }
                //5.2)如果是右括号”)“,则依次弹出s1栈顶元素,并压入s2,直到遇到”(“,并将这一对括号废弃
                if (itme.equals(")")) {
                    while (true) {
                        s2.push(s1.pop());
                        if (s1.peek().equals("(")) {
                            s1.pop();
                            break;
                        }
                    }
                }
            }
        }
        while (true) {
            s2.push(s1.pop());
            if (s1.isEmpty()) {
                break;
            }
        }
        return s2;
    }
}

标签:oper,itme,Java,中缀,s2,s1,栈顶,equals,表达式
来源: https://blog.csdn.net/rotry11/article/details/121137191