算法通关村第四关|黄金挑战|表达式问题

1.计算器问题

给定一个内容为表达式的字符串,计算结果。

java 复制代码
class Solution {
    public int calculate(String s) {
        Deque<Integer> stack = new ArrayDeque<Integer>();
        char preSign = '+';
        int num = 0;
        int n = s.length();
        for (int i = 0; i < n; i++) {
            if (Character.isDigit(s.charAt(i))) {
                num = num * 10 + s.charAt(i) - '0';
            }
            if (!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n - 1) {
                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);
                        break;
                }
                preSign = s.charAt(i);
                num = 0;
            }
        }
        int ans = 0;
        while (!stack.isEmpty()) {
            ans += stack.pop();
        }
        return ans;
    }
}

2.逆波兰表达式(后缀表达式)

给定一个逆波兰表达式,计算结果。

上一题是中缀表达式,这一题是后缀表达式,所以基本思路还是相似的,只是中缀表达式需要将栈中的栈顶元素和还未入栈的元素进行计算,而后缀表达式遇到数字就压栈,遇到符号就拿出来栈顶的两个元素进行计算。

tips:中缀表达式更贴近我们平时用来计算,但是对于计算机来说是很复杂的。而前缀和后缀表达式对于计算机来说处理更快,所以需要将中缀表达式转换为前缀或者后缀表达式再求值。

java 复制代码
public int evalRPN(String[] tokens) {
	Stack<Integer> stack = new Stack<>();
    for (String token : tokens) {
        if (!Character.isDigit(token.charAt(0)) && token.length() == 1) {
            int b = stack.pop();
            int a = stack.pop();
            switch (token) {
                case "+":
                    stack.push(a + b);
                    break;
                case "-":
                    stack.push(a - b);
                    break;
                case "*":
                    stack.push(a * b);
                    break;
                case "/":
                    stack.push(a / b);
                    break;
            }
        } else {
            stack.push(Integer.parseInt(token));
        }
    }
    return stack.pop();
}

如果对您有帮助,请点赞关注支持我,谢谢!❤

如有错误或者不足之处,敬请指正!❤

个人主页:星不易

算法通关村专栏:不易|算法通关村

相关推荐
vivo互联网技术1 分钟前
活动中台系统慢 SQL 治理实践
java·数据库·后端
JohnFF5 分钟前
48. 旋转图像
数据结构·算法·leetcode
bbc1212265 分钟前
AT_abc306_b [ABC306B] Base 2
算法
是小李呀~11 分钟前
【工作梳理】怎么把f12里面的东西导入到postman
java
攀小黑12 分钟前
Java 多线程加锁 synchronized 关键字 字符串当做key
java·开发语言
生锈的键盘13 分钟前
推荐算法实践:movielens数据集
算法
董董灿是个攻城狮14 分钟前
Transformer 通关秘籍9:词向量的数值实际上是特征
算法
林泽毅23 分钟前
SwanLab x EasyR1:多模态LLM强化学习后训练组合拳,让模型进化更高效
算法·llm·强化学习
小林熬夜学编程25 分钟前
【高并发内存池】第八弹---脱离new的定长内存池与多线程malloc测试
c语言·开发语言·数据结构·c++·算法·哈希算法
余华余华25 分钟前
2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
java·职场和发展·蓝桥杯