题目描述
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: “3+2*2”
输出: 7
示例 2:输入: " 3/2 "
输出: 1
示例 3:输入: " 3+5 / 2 "
输出: 5
说明:你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval
做题思路
本题是让我们计算字符串的四则运算的值
本题考察我们的是对栈的使用
首当其冲,我们应该先定义两个栈,一个记录数字,一个记录运算符号
我觉得本题有几点需要是关键的
1.当判断为 "数字字符"的时候,我们不能着急的就塞进栈里,而是应该 继续判断这个字符的下一位是否还是数字字符
2.我们要明确一点:运算优先级一样的,按照从左到右的顺序依次计算!这一点大家都知道,但是运用到代码实现上就很容易出错。
如果当前的字符是运算字符,我们不能直接就往opt栈里面塞,我们需要判断一下当前这个运算字符和栈里面的运算字符元素的优先级,如果大于栈里面的,那直接放进去就可以,如果小于或者是等于的话,就需要把栈里面的运算符号取出来结果数字栈计算之后再把这个字符放进去
代码实现
class Solution {
Stack<Integer> num=new Stack<>();
Stack<Character> opt=new Stack<>();
public int calculate(String s) {
int len=s.length();
int i=0;
while(i<len){
char ch=s.charAt(i);
if(ch==' '){
i++;
continue;
}else if(isNum(ch)){
int n=0;
while(i<len && isNum(s.charAt(i))){
n=n*10+(s.charAt(i)-'0');
i++;
}
num.push(n);
}else{
//2 +3 * 5 /2
// 9
// 2
if(opt.isEmpty() || priority(ch,opt.peek())){
opt.push(ch);
}else{
while(!opt.isEmpty() && !priority(ch,opt.peek())){
cal(num,opt.pop());
}
opt.push(ch);
}
i++;
}
}
while(!opt.isEmpty()){
cal(num,opt.pop());
}
return num.peek();
}
public boolean isNum(char c){
return c>='0' && c<='9';
}
public boolean priority(char op,char ch){
if((op=='*' || op=='/') && (ch=='+' || ch=='-'))return true;
return false;
}
public void cal(Stack<Integer> num,char c){
int num1=num.pop();
int num2=num.pop();
if(c=='+')num.push(num1+num2);
else if(c=='*')num.push(num1*num2);
else if(c=='-')num.push(num2-num1);
else num.push(num2/num1);
}
}