leetcode——逆波兰表达式

中缀表达式转逆波兰表达式:使用栈结构
规则:
(1)运算符优先级 ( > * / > + - > (
(2)建立两个栈,分别是数字栈和运算符栈
(3)遇到数字压入数字栈
(4)遇到(或读取到的运算符 > 栈顶元素,压入运算符栈
(5)遇到)弹出运算符直到弹出(
(6)新读取到的运算符<=栈顶元素,弹出所有>=新读取到的运算符的运算符,该运算符入栈
(7)读取完毕后,将运算符栈中的运算符按顺序弹出压入到数据栈中

逆波兰表达式求值:使用栈结构
规则:遇到数字进栈,遇到运算符时,出栈两个数字进行运算,结果入栈

问题:计算逆波兰式(后缀表达式)的值
运算符仅包含"+","-","“和”/",被操作数可能是整数或其他表达式
例如:
[“2”, “1”, “+”, “3”, "
"] -> ((2 + 1) * 3) -> 9↵ [“4”, “13”, “5”, “/”, “+”] -> (4 + (13 / 5)) -> 6

import java.util.*;
public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<String> stack = new Stack();
        for(int i = 0; i < tokens.length; i++){   
            //注意:负数也是由'-'开头
            if(tokens[i].charAt(0) >= '0' && tokens[i].charAt(0) <= '9' 
               || tokens[i].charAt(0) == '-'&&tokens[i].length() > 1){
                stack.push(tokens[i]);
            }
            else{
                int a = Integer.parseInt(stack.pop());
                int b = Integer.parseInt(stack.pop());
                int c = 0;
                switch(tokens[i]){
                    case "+": c = b+a;break;
                    case "-": c = b-a;break;
                    case "*": c = b*a;break;
                    case "/": c = b/a;break;
                    default:
                }
                stack.push(String.valueOf(c));
            }
        }
        return Integer.parseInt(stack.pop());
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42937036/article/details/105301308
今日推荐