模拟栈
#include<iostream>
using namespace std;
const int N=100010;
int stk[N],tt;
//向站内插入元素
void push(int x)
{
stk[++tt]=x;
}
//从栈顶弹出一个数
void pop()
{
tt--;
}
//判断栈是否为空
void isEmpty()
{
if(tt>0) printf("NO\n");
else printf("YES\n");
}
//查询栈顶元素
void query()
{
cout<<stk[tt]<<endl;
}
int main()
{
int m;
cin>>m;
while(m--)
{
string op;
int x;
cin>>op;
if(op=="push")
{
cin>>x;
push(x);
}
else if(op=="pop") pop();
else if(op=="empty") isEmpty();
else if(op=="query") query();
}
return 0;
}
表达式求值
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
#include<unordered_map>
using namespace std;
stack<int> num;
stack<char> op;
void eval()
{
int x;
//注意,a,b是有顺序的,a先入栈在栈的更里面
auto b = num.top(); num.pop();
auto a = num.top(); num.pop();
auto c = op.top(); op.pop();
if (c == '+') x = a + b;
else if (c == '-') x = a - b;
else if (c == '*') x = a * b;
else x = a / b;
num.push(x);
}
int main()
{
//哈希表 数字越大,优先级越大
unordered_map<char, 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;
while (j < str.size() && isdigit(str[j]))
x = x * 10 + (str[j++] - '0');
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() << endl;
}
避免重复计算