AcWing 3302. 表达式求值
原题链接
简单
作者:
如故
,
2021-03-17 20:56:31
,
所有人可见
,
阅读 522
算法小白第一次写题解,为了顺手练习markdow语法,如有错误请指正
#include <iostream>
#include <unordered_map>
#include <stack>
#include <cstring>
#include <algorithm>
using namespace std;
void eval(stack<int>& num, stack<char>& op)//计算表达式
{
//注意表达式中在前的数在栈中是在更下面
// 表达式 a + b
// 数栈 b
// a
int b = num.top(); num.pop();
int a = num.top(); num.pop();
char c = op.top(); op.pop();
int x;
if (c == '+') x = a + b;
else if (c == '-') x = a - b;
else if (c == '*') x = a * b;
else x = a / b;
num.push(x);
//cout << x << endl;//可以用来调试 模拟下过程当中的计算
}
int main()
{
unordered_map<char, int> pr{{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};// 优先级表
stack<int> num;//数栈
stack<char> op;//运算符栈
string str;//表达式字符串
cin >> str;
for (int i = 0; i < str.size(); i ++ )
{
char c = str[i];//读取一个表达式字符
if (isdigit(c))//判断是否为一个数(多少位),并将这个n位的数存到数栈中
{
int j = i, x = 0;
while (j < str.size() && isdigit(str[j]))
x = x * 10 + str[j ++ ] - '0';
num.push(x);
i = j - 1;// 因为每次比较完后会j ++ ;且外层i循环会i ++ 所以下一次
//应当从j - 1 开始
}
else if (c == '(') op.push(c);//计算小括号内的加法运算 因为后面代码 先处理小括号内的乘法(人类计算过程)
//剩下的就是加减运算了
//可用栈模拟一下运算过程
//貌似数据结构内有后缀表达式的时候有相关内容
else if (c == ')')//计算括号内的加减法
{
while(op.top() != '(') eval(num, op);
op.pop();//弹出左小括号
}
else//优先计算一个小括号内外的乘除法
{
while (op.size() && pr[op.top()] >= pr[c]) eval(num, op);
op.push(c);//计算完括号内外的乘除法后 还得把当前运算符入运算符栈
}
}
while (op.size()) eval(num, op);//计算去掉小括号及乘除法后的低优先级运算
//(上面代码处理了表达式小括号外乘除法 及 括号内的乘除法和加减法)
cout << num.top() << endl;//因为每次运算结果会压入数栈中,所以计算结果保留在栈中
//栈中仅剩栈顶 也就是表达式的运算结果
return 0;
}
- 代码链接及算法复杂度
1.y总代码链接
yxc
2.时间复杂度分析
不晓得咋分析的 我不会 小白(希望来个大佬教教这道题咋分析的)
只会入栈出栈一次所以 O(n) ???但是运算结果又会放回去 但肯定小于n 所以还是O(n)
再来张图片
兄弟你没有填邀请码可以填一个,都可以得AC币!嘿嘿,谢谢兄弟
我的邀请码是:GUDFH