哔哩哔哩做视频网站,用c 做一个小网站怎么做,广东宇晟建设工程有限公司网站,百度手机app下载安装给定一个表达式#xff0c;其中运算符仅包含 ,-,*,/#xff08;加 减 乘 整除#xff09;#xff0c;可能包含括号#xff0c;请你求出表达式的最终值。
注意#xff1a;
数据保证给定的表达式合法。题目保证符号 - 只作为减号出现#xff0c;不会作为负号…给定一个表达式其中运算符仅包含 ,-,*,/加 减 乘 整除可能包含括号请你求出表达式的最终值。
注意
数据保证给定的表达式合法。题目保证符号 - 只作为减号出现不会作为负号出现例如-12,(22)*(-(11)2) 之类表达式均不会出现。题目保证表达式中所有数字均为正整数。题目保证表达式在中间计算过程以及结果中均不超过 2^31−1。题目中的整除是指向 取整也就是说对于大于 0 的结果向下取整例如 5/31对于小于 0 的结果向上取整例如 5/(1−4)−1。C和Java中的整除默认是向零取整Python中的整除//默认向下取整因此Python的eval()函数中的整除也是向下取整在本题中不能直接使用。
输入格式
共一行为给定表达式。
输出格式
共一行为表达式的结果。
数据范围
表达式的长度不超过 10^5。
输入样例
(22)*(11)输出样例
8
代码双stack 运算优先级map
// 双目运算符的模板若有乘方等双目运算符则也可扩展eval()
#include iostream
#include stack
#include unordered_map //哈希表
#include cstring
using namespace std;stackint num; // 数字栈
stackchar op; // 运算符栈 ( ) - * /
void eval()
{auto b num.top();num.pop();auto a num.top();num.pop();auto c op.top();op.pop();int ans;if (c )ans a b;if (c -)ans a - b;if (c *)ans a * b;if (c /)ans a / b;num.push(ans);
}
int main()
{unordered_mapchar, int pr {{, 1}, {-, 1}, {*, 2}, {/, 2}};string str;cin str;for (int i 0; i str.size(); i){auto c str[i];if (isdigit(c)){ // 扫描到数字int x 0, j i; // 从j开始搜while (j str.size() isdigit(str[j])){ // 读连续数字x x * 10 (str[j] - 0);j;}i j - 1;num.push(x);}else if (c () // 左括号直接入栈op.push(c);else if (c )){ // 右括号不入栈遇到直接计算括号内的表达式while (op.top() ! ()eval();op.pop();}else // 扫描到运算符{ // 如果栈顶运算符优先级较高,先操作栈顶元素再入栈while (op.size() pr[op.top()] pr[c])eval();// 如果栈顶运算符优先级较低,直接入栈op.push(c);}}while (op.size()) // 把没有操作完的运算符从右往左操作一遍eval();cout num.top();return 0;
}