一.题目描述
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。
整数除法仅保留整数部分。
示例 1:
输入:s = “3+2*2”
输出:7
示例 2:
输入:s = " 3/2 "
输出:1
示例 3:
输入:s = " 3+5 / 2 "
输出:5
提示:
1 <= s.length <= 3 * 105
s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开
s 表示一个 有效表达式
表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内
题目数据保证答案是一个 32-bit 整数
二.题目解析
1.双栈法
public static int calculate(String s) {
/*时间复杂度O(n),空间复杂度O(n)
* */
if(s == null || s.length() == 0){
return -1;
}
//!作为终止符,方便读取表达式中的最后一个数
s = s.trim() + "!";
//利用两个栈,一个操作数栈,一个操作符栈
Stack<Integer> operand = new Stack<>();
Stack<Character> operator = new Stack<>();
char cur;
Integer number;
int previous = -1;
int left,right;
for (int i = 0; i < s.length(); i++) {
cur = s.charAt(i);
if(cur == ' '){
continue;
}
//每次读到运算符号,获取到这个运算符前面的那个数字,入操作数栈
if(cur == '+' || cur == '-' || cur == '*' || cur == '/' || cur == '!'){
//截取到的字符串可能含有前后空格