第四关|栈的表达式问题

1、计算器问题

leetcode227

给你一个字符串表达式 s ,实现一个基本计算器来计算并返回它的值,整数除法仅保留整数部分

输入:s = "3+2*2"

输出:7

用栈存储中间值,preSign记录运算符,num记录当前数字。

  1. 遇到数字更新num值。
  2. 遇到运算符,看preSign,进行相应操作后,更新preSign和num值
  3. 最后一个字符时,要对preSign进行相应操作

  1. +:num存栈
  2. -:-num存栈
  3. *:弹出栈顶值与当前num相乘,并将结果存栈
  4. /:弹出栈顶值与当前num相除,并将结果存栈

最后将栈中值进行求和(中间值的相加),得出计算结果

public class Calculate {
    public static void main(String[] args) {

        System.out.println(calculate("2 + 3 * 3"));

    }

    public static int calculate(String s){
        if(s.isEmpty()){
            return 0;
        }

        Deque<Integer> stack = new ArrayDeque<Integer>();
        int num = 0;
        char preSign = '+';
        int n = s.length();

        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);

            if(Character.isDigit(c)){
                num = num * 10 + c - '0';
            }

            if(!Character.isDigit(c) && c != ' ' || i + 1 == n){
                switch(preSign){
                    case '+':
                        stack.push(num);
                        break;
                    case '-':
                        stack.push(-num);
                        break;
                    case '*':
                        stack.push(stack.pop() * num);
                        break;
                    default:
                        stack.push(stack.pop() / num);
                }
                preSign = c;
                num = 0;
            }
        }

        int ans = 0;
        while(!stack.isEmpty()){
            ans += stack.pop();
        }
        return ans;
    }
}

2、逆波兰表达式

leetcode150

又称后缀表达式,即运算符在后。

中缀表达式:1 + (2 + 3) × 4 - 5

前缀表达式:- + 1 × + 2 3 4 5

后缀表达式:1 2 3 + 4 × + 5 -

遇数压栈,遇运算符弹出两数运算后压栈。

注意 - 和 /:

先弹出的作为被减/除数(即b-a,b/a)

public class EvalRPN {
    public static void main(String[] args) {

        String[] tokens = {"2", "1", "+", "3", "*"};
        System.out.println(evalRPN(tokens));

    }

    public static int evalRPN(String[] tokens){

        Stack<Integer> stack = new Stack<>();

        for (String token : tokens) {
            if(!Character.isDigit(token.charAt(0)) && token.length() == 1){
                int a = stack.pop();
                int b = stack.pop();

                switch(token){
                    case "+":
                        stack.push(a + b);
                        break;
                    case "-":
                        stack.push(b - a);
                        break;
                    case "*":
                        stack.push(a * b);
                        break;
                    case "/":
                        stack.push(b / a);
                        break;
                }

            }else{
                stack.push(Integer.parseInt(token));
            }
        }
        return stack.pop();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值