1、计算器问题
leetcode227
给你一个字符串表达式 s ,实现一个基本计算器来计算并返回它的值,整数除法仅保留整数部分
输入:s = "3+2*2"
输出:7
用栈存储中间值,preSign记录运算符,num记录当前数字。
- 遇到数字更新num值。
- 遇到运算符,看preSign,进行相应操作后,更新preSign和num值
- 最后一个字符时,要对preSign进行相应操作
- +:num存栈
- -:-num存栈
- *:弹出栈顶值与当前num相乘,并将结果存栈
- /:弹出栈顶值与当前num相除,并将结果存栈
最后将栈中值进行求和(中间值的相加),得出计算结果
public class Calculate {
public static void main(String[] args) {
System.out.println(calculate("2 + 3 * 3"));
}
public static int calculate(String s){
if(s.isEmpty()){
return 0;
}
Deque<Integer> stack = new ArrayDeque<Integer>();
int num = 0;
char preSign = '+';
int n = s.length();
for (int i = 0; i < n; i++) {
char c = s.charAt(i);
if(Character.isDigit(c)){
num = num * 10 + c - '0';
}
if(!Character.isDigit(c) && c != ' ' || i + 1 == n){
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);
}
preSign = c;
num = 0;
}
}
int ans = 0;
while(!stack.isEmpty()){
ans += stack.pop();
}
return ans;
}
}
2、逆波兰表达式
leetcode150
又称后缀表达式,即运算符在后。
中缀表达式:1 + (2 + 3) × 4 - 5
前缀表达式:- + 1 × + 2 3 4 5
后缀表达式:1 2 3 + 4 × + 5 -
遇数压栈,遇运算符弹出两数运算后压栈。
注意 - 和 /:
先弹出的作为被减/除数(即b-a,b/a)
public class EvalRPN {
public static void main(String[] args) {
String[] tokens = {"2", "1", "+", "3", "*"};
System.out.println(evalRPN(tokens));
}
public static int evalRPN(String[] tokens){
Stack<Integer> stack = new Stack<>();
for (String token : tokens) {
if(!Character.isDigit(token.charAt(0)) && token.length() == 1){
int a = stack.pop();
int b = stack.pop();
switch(token){
case "+":
stack.push(a + b);
break;
case "-":
stack.push(b - a);
break;
case "*":
stack.push(a * b);
break;
case "/":
stack.push(b / a);
break;
}
}else{
stack.push(Integer.parseInt(token));
}
}
return stack.pop();
}
}