其他分享
首页 > 其他分享> > LeetCode 基本计算器II

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