题号:no85
题目名:计算器
原题URL:https://leetcode-cn.com/problems/calculator-lcci/
题目描述
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
限制
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数
eval
。
思路
1.用栈去解决
2.默认前面有个0 + ,如果是数字,就将这个数进行计算
3.如果是运算符,那么就将这次运算符保留到下次,然后上次的运算符计算这次的结果
4.如果加就直接放进去,减放他的相反数,乘的话先出栈然后和对应的数相乘;如果除也是出栈,和现在计算的数相除,维持先乘除后加减的逻辑
5.最后将所有数出栈后相加
解题代码
class Solution {
public int calculate(String s) {
String str = s.trim();
char[] chars = str.toCharArray();
//计算器用栈的方式去解决
Deque<Integer> stack = new ArrayDeque<>();
int idx= 0;
int temp1 = 0;
char op = '+';
//遍历字符串
while(idx<chars.length) {
char c = chars[idx];
if(c ==' ') {
idx++;
continue;
}
//如果碰到的是数字,就先计算数字结果
if(Character.isDigit(c)) {
//如果是数字
temp1=temp1*10+ c -'0';
idx++;
}
//如果碰到的是运算符,或者到末尾了,直接执行操作
if(!Character.isDigit(c)||idx == chars.length) {
int pre = 0;
switch (op) {
//加法,将已经算好的数直接存进去
case '+' :{
stack.addLast(temp1);
break;
}
case '-' :{
stack.addLast(-temp1);
break;
}
case '*' :{
pre = stack.removeLast();
stack.addLast(pre*temp1);
break;
}
case '/' :{
pre = stack.removeLast();
stack.addLast(pre/temp1);
break;
}
}
temp1 = 0;
op = c;
idx++;
}
}
int res =0;
while (!stack.isEmpty()) {
res+= stack.removeLast();
}
return res;
}
}