面试题 16.26. 计算器
难度中等34收藏分享切换为英文接收动态反馈
给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。
表达式仅包含非负整数,+
, -
,*
,/
四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
- 你可以假设所给定的表达式都是有效的。
- 请不要使用内置的库函数
eval
。
方法一:
public class Calculator {
public int calculate(String s) {
s=s.trim();
List<Integer> list=new ArrayList<>();
int i=0;
int shuzi=0;
int fuhao=0;
while(i<s.length()){
while(s.charAt(i)==' '){
i++;
}
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
shuzi=10*shuzi+s.charAt(i)-'0';
if(i==s.length()-1){
if(fuhao==0){list.add(shuzi);}
else if(fuhao==1){list.add(-shuzi);}
else if(fuhao==2){
list.set(list.size()-1,shuzi*list.get(list.size()-1));
}
else{
list.set(list.size()-1,list.get(list.size()-1)/shuzi);
}
}
}
else{
if(fuhao==0){list.add(shuzi);}
else if(fuhao==1){list.add(-shuzi);}
else if(fuhao==2){
list.set(list.size()-1,shuzi*list.get(list.size()-1));
}
else{
list.set(list.size()-1,list.get(list.size()-1)/shuzi);
}
shuzi=0;
if(s.charAt(i)=='+'){fuhao=0;}
else if(s.charAt(i)=='-'){fuhao=1;}
else if(s.charAt(i)=='*'){fuhao=2;}
else{fuhao=3;}
}
i++;
}
int ans=0;
for(int j=0;j<list.size();j++){
ans+=list.get(j);
}
return ans;
}
}
方法二:
public class CalculatorTest2 {
public int calculate(String s) {
s=s.trim();
Stack<Integer> stack=new Stack<>();
int i=0;
int shuzi=0;
int fuhao=0;
while(i<s.length()){
while(s.charAt(i)==' '){
i++;
}
if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
shuzi=10*shuzi+s.charAt(i)-'0';
if(i==s.length()-1){
if(fuhao==0){stack.push(shuzi);}
else if(fuhao==1){stack.push(-shuzi);}
else if(fuhao==2){
stack.push(shuzi*stack.pop());
}
else{
stack.push(stack.pop()/shuzi);
}
}
}
else{
if(fuhao==0){stack.push(shuzi);}
else if(fuhao==1){stack.push(-shuzi);}
else if(fuhao==2){
stack.push(shuzi*stack.pop());
}
else{
stack.push(stack.pop()/shuzi);
}
shuzi=0;
if(s.charAt(i)=='+'){fuhao=0;}
else if(s.charAt(i)=='-'){fuhao=1;}
else if(s.charAt(i)=='*'){fuhao=2;}
else{fuhao=3;}
}
i++;
}
int ans=0;
while(!stack.empty()){
ans+=stack.pop();
}
return ans;
}
}
}
int ans=0;
while(!stack.empty()){
ans+=stack.pop();
}
return ans;
}
}