1、题目描述
1.1题目
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
1.2例子
示例 1:
输入:s = "3+2*2"
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
1.3提示条件
1 <= s.length <= 3 * 105
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
2、代码展示
下面展示一些 内联代码片
。
class Solution {
public int calculate(String s) {
Deque<Integer> stack = new LinkedList<Integer>();
int n = s.length();
int num = 0;
char preSign = '+';
for(int i = 0; i < n; ++i){
if(Character.isDigit(s.charAt(i))){
num = num * 10 + s.charAt(i) - '0';
}
if(!Character.isDigit(s.charAt(i)) && s.charAt(i) != ' ' || i == n-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 ans = 0;
while(!stack.isEmpty()){
ans += stack.pop();
}
return ans;
}
}
//题目可能考你s的转换还有栈的使用
//主要考虑到加号:将数字压入栈;减号:将数字的相反数压入栈,乘除:将数字与栈顶元素,并将栈顶元素替换为计算结果
//https://blog.csdn.net/top_code/article/details/8650910,关于栈的说明,还是不太懂那个Deque<Integer> stack = new LinkedList<Integer>();
//难点在于数据类型处理,不在于算法,
//num = num * 10 + s.charAt(0) - '0'; //因为后面有num = 0,所以为什么这样可以将字符转换为整数型
//首先:char型都有个ASCII码值,str[i]-'0'就把数字字符便成了相应的数字值。
//再者:num=num*10+每次读到一个数字,就把num乘10,再加上这个数字,由于是从高位读取的,就还原出了这个数。就像23可以分解成:2*10+3一样,逐步分解的反向操作,就合成了数字。
//循环中其他语句都是为了判断数字的正负符号。
//自己:本来按照num*10是因为读取字符串湿例如“123”一开始加入1要*10才能加上2,然后char c -‘0’就相当于将数字字符变成相应的数字值
//(顶级接口)Collection-->Queue-->Deque-->LinkedList(实现类)