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

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();
}

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

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

个人主页:星不易

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

相关推荐
手握风云-7 小时前
ProtoBuf:从序列化原理到高性能架构底座(一)
java·网络·架构
h_a_o777oah7 小时前
【算法专项】扩展域并查集:原理详解及解决大部分种类并查集问题(洛谷P5937 P2024 C++代码)
数据结构·c++·算法·acm·并查集·扩展域·逻辑建模
摇滚侠7 小时前
SpringMVC 入门到实战 配置类替换 XML 配置文件 86-91
xml·java·后端·spring·maven·intellij-idea
栗子~~7 小时前
金融场景下BigDecimal 运算规范 + 常用场景使用 + 数据库字段设计详解
java·数据库·金融
我登哥MVP7 小时前
SpringCloud Alibaba 核心组件解析:服务注册与发现(Nacos)
java·spring boot·后端·spring·spring cloud·java-ee·maven
兰令水7 小时前
leecodecode【单调栈】【2026.6.12打卡-java版本】
java·开发语言·算法
云烟成雨TD8 小时前
Agent Scope Java 2.x 系列【8】工具调用
java·人工智能·agent
TMT星球8 小时前
魔法原子上交会首秀VLA K02大模型,完成具身智能从“执行”到“理解”的能力跃迁
人工智能·算法·机器学习
2301_764441338 小时前
番茄钟+AI:高效专注的秘密武器
人工智能·算法·数学建模·动态规划·交互
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题 第112题】【并发篇】第12题:AQS 中节点的入队时机有哪些?
java·开发语言·面试