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

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

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

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

个人主页:星不易

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

相关推荐
有一个好名字几秒前
力扣-删除二叉搜索树的节点
算法·leetcode·职场和发展
不想写bug呀几秒前
Redis持久化:RDB与AOF
java·数据库·redis
CV_J7 小时前
安装kibana
java·elasticsearch·spring cloud·docker·容器
码农水水9 小时前
国家电网Java面试被问:TCP的BBR拥塞控制算法原理
java·开发语言·网络·分布式·面试·wpf
2013092416279 小时前
1968年 Hart, Nilsson, Raphael 《最小成本路径启发式确定的形式基础》A* 算法深度研究报告
人工智能·算法
如何原谅奋力过但无声9 小时前
【力扣-Python-滑动窗口经典题】567.字符串的排列 | 424.替换后的最长重复字符 | 76.最小覆盖子串
算法·leetcode
qq_336313939 小时前
java基础-网络编程-TCP
java·网络·tcp/ip
咕噜咕噜啦啦10 小时前
Java期末习题速通
java·开发语言
盐真卿10 小时前
python2
java·前端·javascript
玄冥剑尊10 小时前
贪心算法进阶
算法·贪心算法