持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
一、题目描述:
根据 逆波兰表示法,求该后缀表达式的计算结果。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明:
整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
示例 1:
输入:tokens = ["2","1","+","3","*"] 输出:9 解释:该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 示例 2:
输入:tokens = ["4","13","5","/","+"] 输出:6 解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6 示例 3:
输入:tokens = ["10","6","9","3","+","-11","","/","","17","+","5","+"] 输出:22 解释: 该算式转化为常见的中缀算术表达式为: ((10 * (6 / ((9 + 3) * -11))) + 17) + 5 = ((10 * (6 / (12 * -11))) + 17) + 5 = ((10 * (6 / -132)) + 17) + 5 = ((10 * 0) + 17) + 5 = (0 + 17) + 5 = 17 + 5 = 22
提示:
1 <= tokens.length <= 104 tokens[i] 要么是一个算符("+"、"-"、"*" 或 "/"),要么是一个在范围 [-200, 200] 内的整数
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波兰表达式主要有以下两个优点:
去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。
二、思路分析:
数字和算符都是依次被遍历,进入计算。参与计算的数字被抛出,计算的结果被保留,然后再让后续的数字或算符进入。整个过程特别适合用栈。 逆波兰后缀表达式计算: 1、把需要操作的数存入栈 2、遇到操作符,弹出栈顶两个计算,得到的数入栈 3、最后栈顶的就是计算结果 关键地方: 1.判断每个字符是数字还是操作者,数字需要关注的是是否有符号(-或+) 2.弹出的两个数,第一个数作为减数或者除数
三、AC 代码:
class Solution {
class MyStack<T>{
class Node<T>{
private T t;
private Node next;
}
private Node<T> head;
MyStack(){
head = null;
}
public void push(T t) {
if (t == null) {
throw new NullPointerException("could not be null");
}
if (head == null) {
head = new Node<T>();
head.t = t;
head.next = null;
} else {
Node<T> temp = head;
head = new Node<>();
head.t = t;
head.next = temp;
}
}
public T pop() {
T t = head.t;
head = head.next;
return t;
}
public T peek() {
T t = head.t;
return t;
}
public boolean isEmpty() {
if (head == null)
return true;
else
return false;
}
}
public int evalRPN(String[] tokens) {
MyStack<Integer> stack = new MyStack<>();
for (String t : tokens)
{
if (!t.equals("+") && !t.equals("-") && !t.equals("*") && !t.equals("/"))
{
stack.push(Integer.parseInt(t));
}
else
{
int b = stack.pop();
int a = stack.pop();
if (t.equals("+"))
stack.push(a + b);
else if (t.equals("-"))
stack.push(a - b);
else if (t.equals("*"))
stack.push(a * b);
else
stack.push(a / b);
}
}
return stack.peek();
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐
希望对你有帮助
期待下次再见~
🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!