题目描述:
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2" 输出: 7
示例 2:
输入: " 3/2 " 输出: 1
示例 3:
输入: " 3+5 / 2 " 输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
class Solution {
public int calculate(String s) {
}
}
思路:我们可以使用栈来进行处理。如果是加或者减就把它压入栈;如果是乘除就把栈顶元素pop来与乘/除号后面的元素计算然后再push。最后把栈所有元素取出相加。
需要处理: 因为可能会出现一位数以上的数字,比如两位数字3;所以我们需要进行这样的处理:
num=num*10+s.charAt(i)-'0';
判断:
数字:if(Character.isDigit(s.charAt(i)){
)
符号/带空格/最后一位是数字:
if(!Character.isDigit(s.charAt(i) && s.charAt(i)==' ' || i==length-1 ){
)
数字的处理就用num那个
符号/带空格/最后一位是数字处理:
switch(sign){
case '+':
stack.push(num);
break;
case '-':
stack.push(-num);
break;
case '*':
stack.push(stack.pop * num);
break;
default:
stack.push(stack.pop / num);
break;
}
sign=s.charAt(i);
num=0;//在这个if里归零
循环结束
int result=0;
while(!stack.isempty()){
result+= stack.pop
}
完整代码:
class Main{public int calculate(String s) {
Deque<Integer> stack=new ArrayDeque();char preSign='+';int num=0;int length=s.length();for (int i = 0; i <length ; i++) {if (Character.isDigit(s.charAt(i))){num=num*10+s.charAt(i)-'0';}if (!Character.isDigit(s.charAt(i))&&s.charAt(i)!=' '||i==length-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 result=0;while(!stack.isEmpty()){result+=stack.pop();}return result;}
}