題目
-
概述:給你一個(gè)逆波蘭表達(dá)式,求表達(dá)式的值
逆波蘭表達(dá)式:
也叫后綴表達(dá)式
一個(gè)表達(dá)式E的后綴形式可以如下定義:
(1)如果E是一個(gè)變量或常量,則E的后綴式是E本身
(2)如果E是E1 op E2形式的表達(dá)式,這里op是二元操作符,則E的后綴表達(dá)式是E1'E2'op,這里E1'和E2'分別為E1和E2的后綴式
(3)如果E是(E1)形式的表達(dá)式,則E1的后綴式就是E的后綴式有效的運(yùn)算符包括+,-,*,/
整數(shù)除法只保留整數(shù)部分
給定逆波蘭表達(dá)式總是有效的
輸入:逆波蘭表達(dá)式字符串列表
輸入子項(xiàng):字符串(整數(shù)或者運(yùn)算符)
輸出:逆波蘭表達(dá)式的值
出處:https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
思路
由于需要存儲(chǔ)字符串進(jìn)行后面的運(yùn)算,所以采用棧實(shí)現(xiàn)
-
遍歷逆波蘭表達(dá)式字符串列表,對(duì)于每一個(gè)字符串S
- S是運(yùn)算符 => 彈出棧頂元素兩次,用第二次彈出的元素和第一次彈出的元素根據(jù)對(duì)應(yīng)的運(yùn)算符做運(yùn)算,然后將運(yùn)算結(jié)果放入棧中
- S是整數(shù) => 直接放入棧中
最后棧中唯一元素即為逆波蘭表達(dá)式的值
代碼
class Solution {
public int evalRPN(String[] tokens) {
LinkedList<Integer> stack = new LinkedList<>();
int number;
for (String s : tokens) {
switch (s) {
case "+":
number = stack.pop();
stack.push(stack.pop() + number);
break;
case "-":
number = stack.pop();
stack.push(stack.pop() - number);
break;
case "*":
number = stack.pop();
stack.push(stack.pop() * number);
break;
case "/":
number = stack.pop();
stack.push(stack.pop() / number);
break;
default:
stack.push(Integer.parseInt(s));
break;
}
}
return stack.pop();
}
}