栈应用之解决表达式计算

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈应用之解决表达式计算相关的知识,希望对你有一定的参考价值。

一、题目

一个表达式只含有:‘0’~‘9’,’+’,‘x’,’@’ 字符

‘+’:加法运算
‘x’:乘法运算
‘@’ :定义a@b=a|(a+b)

运算优先级:@>x>+

二、题解

对于表达式计算,首先考虑栈解决

本题需要两个栈,一个记录数字 deque1,一个记录运算符 deque2

如果当前是数字则入栈 deque1

如果当前是运算符,需要判断下,如果当前栈不为空,

且当前运算符的优先级小于deque2的栈顶运算符的优先级,则deque1出栈两个元素,使用栈顶运算符进行计算

直到当前运算符大于栈顶运算符的优先级

三、代码

import java.util.Deque;
import java.util.LinkedList;

public class Main 
    public static void main(String[] args) 
        String str = "1@2@3";
        //记录数字
        Deque<Integer> deque1 = new LinkedList<>();
        //记录运算符
        Deque<Character> deque2 = new LinkedList<>();
        int start = 0;
        while (start < str.length()) 
            String temp = "";
            //如果当前字符时数字
            while (start < str.length() && str.charAt(start) >= '0' && str.charAt(start) <= '9') 
                temp += str.charAt(start++);
            
            //如果当前字符时运算符
            if ("".equals(temp)) 
                //如果当前运算符的优先级大于栈顶元素的优先级则入栈
                if (deque2.isEmpty() || isBig(str.charAt(start), deque2.peek())) 
                    deque2.push(str.charAt(start++));
                 else 
                    //否则出栈运算,直到当前运算符的优先级大于栈顶元素的优先级
                    while (!deque2.isEmpty() && !isBig(str.charAt(start), deque2.peek())) 
                        char ch = deque2.pop();
                        int data1 = deque1.pop();
                        int data2 = deque1.pop();
                        //进行计算
                        int data = getData(data1, data2, ch);
                        deque1.push(data);
                    
                    deque2.push(str.charAt(start++));
                
             else 
                deque1.push(Integer.parseInt(temp));
            
        
        while (!deque2.isEmpty()) 
            char ch = deque2.pop();
            int data1 = deque1.pop();
            int data2 = deque1.pop();
            int data = getData(data1, data2, ch);
            deque1.push(data);
        
        System.out.println(deque1.peek());
    

    private static int getData(int data1, int data2, char ch) 
        if (ch == '+') 
            return data1 + data2;
        
        if (ch == 'x') 
            return data1 * data2;
        
        return data1 | (data1 + data2);
    

    private static boolean isBig(char charAt, char peek) 
        if (charAt == '@' && peek != '@') 
            return true;
        
        if (charAt == 'x' && peek == '+') 
            return true;
        

        return false;
    

以上是关于栈应用之解决表达式计算的主要内容,如果未能解决你的问题,请参考以下文章

数据结构-栈的应用之中缀表达式的计算

数据结构-栈的应用之中缀表达式的计算

数据结构-栈的应用之中缀表达式的计算

数据结构栈之计算后缀表达式

(王道408考研数据结构)第三章栈和队列-第三节1:栈的应用之括号匹配问题和表达式问题(前缀中缀和后缀)

双栈完全解决计算器问题