LeetCode 基本计算器II
作者:互联网
实现一个基本的计算器来计算一个简单的字符串表达式的值。
字符串表达式仅包含非负整数,+, - ,*,/ 四种运算符和空格 。 整数除法仅保留整数部分。
示例 1:
输入: "3+2*2"
输出: 7
示例 2:
输入: " 3/2 "
输出: 1
示例 3:
输入: " 3+5 / 2 "
输出: 5
说明:
你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。
其实这道题还没有上一道题复杂 LeetCode 基本计算器
这道题把括号去掉了,然后添加乘法、除法运算。思路一样的,不过逻辑严密性还是需要的。进行运算是需要考虑到优先级的问题。
class Solution {
private:
stack<int> dataStack;//数据栈
stack<char> operatorStack;//操作符栈
int sSize, tempValueOne, tempValueTwo;
long long numRead;
char operatorCh;
public:
void myOP() {
//获取数据栈的栈顶两个元素,注意出栈顺序,先出的右操作数,后出的才是左操作数
tempValueTwo = dataStack.top();
dataStack.pop();
tempValueOne = dataStack.top();
dataStack.pop();
//获取操作符栈顶元素
operatorCh = operatorStack.top();
operatorStack.pop();
//进行运算,结果放回数据栈
switch (operatorCh) {
case '-': dataStack.push(tempValueOne - tempValueTwo); break;
case '+': dataStack.push(tempValueOne + tempValueTwo); break;
case '*': dataStack.push(tempValueOne * tempValueTwo); break;
case '/': dataStack.push(tempValueOne / tempValueTwo); break;
default: break;
}
}
int calculate(string s) {
sSize = s.size();
for (int index = 0; index < sSize; ) {//扫描字符串
if (s[index] == ' ') {//如果是空格
index += 1;
}
else if (s[index] == '+' || s[index] == '-') {//左括号、操作符直接进操作符栈
//因为加减法的优先级比较低,所以之前的堆积的计算需要全部处理掉
while (!operatorStack.empty()) {
myOP();//进行一次计算
}
//然后再放置运算符到操作符栈
operatorStack.push(s[index++]);
}
else if (s[index] == '*' || s[index] == '/') {//如果是乘除法,则需要考虑优先级的问题
//只有当前面的操作也是乘除法才能进行计算,因为乘除法同一优先级,所以需要处理之前堆积的乘除法
while (!operatorStack.empty() && (operatorStack.top() == '*' || operatorStack.top() == '/')) {
myOP();
}
//然后再放置运算符到操作符栈
operatorStack.push(s[index++]);
}
else {
//读取一个操作数
numRead = 0;
while (index < sSize && s[index] >= '0' && s[index] <= '9') {
numRead = numRead * 10 + s[index++] - '0';
}
dataStack.push(numRead);//直接放入数据栈
}
}
while (!operatorStack.empty()) {
myOP();//进行一次运算操作
}
return dataStack.top();
}
};
标签:index,operatorStack,II,计算器,push,dataStack,tempValueOne,LeetCode,tempValueTwo 来源: https://blog.csdn.net/qq_41855420/article/details/88080569