实现一个基本的计算器来计算一个简单的字符串表达式的值。
示例 :
输入: “6+5/3-2*2”
输出: 3
因为乘除的优先级大于加减,我们现实现加减运算
我们使用数据结构栈Stack,是先进后出,有进栈和出栈两种
方法一般用到的有如下的方法:
IsEmpty() //判断是否为满
bool IsFull() //判断是否为空
pop(); //出栈并获得栈顶值
int push(const T& data); //进栈
getPop() 获得栈顶元素值
clear() //清空栈
首先解决的问题是:
字符123 如何转化为数字123
依次读取每个字符
110+2
1210+3
num = num*10+(a-‘0’);
例如计算6-3+2我们放入栈中就是
+6 <--------指针
-3
+2
6+(-3)+2
然后依次取出栈中的数经行相加,就可以得到结果:
具体代码如下:
class Solution {
public int calculate(String s) {
s = s.replace(" ","");
Stack<Integer> stk = new Stack();
int num = 0;
char fu = '+';
设初始的符号为+,表示正数,
for(int i =0;i<s.length();i++){
char a = s.charAt(i);
if(isnumber(a)){
num = num*10+(a-'0');
}
if(!isnumber(a)||i==s.length()-1){
int p;
switch(fu){
case '+': stk.push(num); break;
case '-': stk.push(-num); break;
case '/': p= stk.pop();
//取出栈顶的值,并移除栈顶的值
stk.push(p/num);break;
case '*': p= stk.pop();
stk.push(p*num);
break;
}
fu = a;
//把数放入栈中,同时将符号改变,这里是理解的关键
num =0;
}
}
int result = 0;
//运用while()循环,获得结果
while(!stk.isEmpty()){
result += stk.pop();
}
return result;
}
//判断是否为数字的方法
也可以使用
Character.isDigit(ch)
public boolean isnumber(char s) {
boolean right = false;
if(s>='0'&&s<='9'){
right = true;
}
return right;
}
}
计算加减以及括号的运算
输入: “(6-3)+(6+8)”
输出: 17
class Solution {
public int calculate(String s) {
Stack<Integer> stack = new Stack();
int fuhao = 1;
int sum = 0;
int num = 0;
for(int i = 0;i<s.length();i++){
char ch = s.charAt(i);
if(Character.isDigit(ch)){
num = 10*num + (int)(ch-'0');
}
else if(ch=='+') {
sum += fuhao*num;
fuhao = 1;
num = 0;
} else if(ch=='-') {
sum +=fuhao*num;
fuhao = -1;
num = 0;
} else if(ch=='(') {
stack.push(sum);
stack.push(fuhao);
fuhao = 1;
sum = 0;
} else if(ch==')') {
sum+=fuhao*num;
sum *=stack.pop();
sum+=stack.pop();
num = 0;
}
}
return sum+fuhao*num;
}
}