题目描述
实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。
样例
输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23
算法
栈模拟
本题不难,难在怎么一次做对
-
开两个栈一个存放操作数和括号(栈1,为方便负数运算,这里栈建议定义成数值型,括号可以使用特殊数值替代),一个存放运算符+、-(栈2)
-
遇到’('直接入栈1,遇到运算符直接入栈2;
-
遇到’)‘先不要让其入栈,弹出栈1的栈顶元素放入temp保存,再弹出栈1的栈顶元素(这个元素一定是’(’,没有为什么,按照这套逻辑一定是),再将temp放回栈1
-
遇到操作数的要分情况
- 栈1的栈顶也是操作数,那么将栈1栈顶元素弹出,栈2栈顶操作符弹出,二者做运算,将结果入栈1
- 栈1的栈顶不是操作数(可能是括号或啥也没有),那么直接将操作数入栈
-
按照如上逻辑可以兼顾多位数和负数的运算,但有一种情况需要特判就是开头就是’-‘的情况,这样只用判定开头是否是’-’,若是,只需在栈1中压入0,栈2中压入-,从下标为1号元素开始判定即可
时间复杂度
O ( n ) O(n) O(n)
Java 代码
class Solution {
int[] stk1; // 存放操作数和括号
char[] stk2; // 存放运算符
int tt1 = 0, tt2 = 0;
String s;
final int INF = 0x3f3f3f3f; // 用来表示(
int solve(int num1, int num2, char op)