思路
https://www.acwing.com/problem/content/830/
数组模拟栈:
用top表示栈顶所在的索引。初始时,top = -1。表示没有元素。
push x :栈顶所在索引往后移动一格,然后放入x。st[++top] = x。
pop : top 往前移动一格。top–。
empty :top 大于等于 0 栈非空,小于 0 栈空。top == -1 ? “YES” : “NO”
query : 返回栈顶元素。st[top]
AC代码
#include <iostream>
using namespace std;
const int N = 100010;
int stack[N], top = -1;
int m;
int main()
{
string op;
cin >> m;
while (m -- )
{
cin >> op;
if(op == "push") // 压栈
{
int x;
cin >> x;
stack[++ top] = x;
}
else if(op == "pop") // 出栈
{
top --;
}
else if(op == "empty") // 是否为空
{
if(top < 0) cout << "YES" << endl;
else cout << "NO" << endl;
}
else if(op == "query") // 查询栈顶
{
cout << stack[top] << endl;
}
}
return 0;
}
习题 表达式计算
思路
https://www.acwing.com/solution/content/40978/
AC代码
#include <iostream>
#include <stack>
#include <string>
#include <unordered_map>
using namespace std;
// 定义两个栈 一个数字栈 一个符号栈
stack<int> num;
stack<char> op;
// 优先级表
unordered_map<char, int> p {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
void eval()
{
int b = num.top(); num.pop();
int a = num.top(); num.pop();
int h = op.top(); op.pop();
if(h == '+') num.push(a + b);
if(h == '-') num.push(a - b);
if(h == '*') num.push(a * b);
if(h == '/') num.push(a / b);
}
int main()
{
// 读入表达式
string s;
cin >> s;
for(int i = 0; i < s.size(); i ++)
{
if(isdigit(s[i]))
{
// 如果不止一位数字
int x = 0, j = i;
while(j < s.size() && isdigit(s[j]))
{
x = x * 10 + s[j] - '0';
j ++;
}
num.push(x);
i = j - 1;
}
else if(s[i] == '(')
{
op.push(s[i]);
}
else if(s[i] == ')')
{
// 如果是右括号一直计算到左括号
while(op.top() != '(') eval();
op.pop();
}
else
{
// 栈顶操作符比准备压入的操作符优先级高 则先计算
while(op.size() && p[op.top()] >= p[s[i]]) eval();
op.push(s[i]);
}
}
while(op.size()) eval();
cout << num.top() << endl;
return 0;
}
单调栈问题
问题描述
给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。
输入样例:
5
3 4 2 7 5
输出样例:
-1 3 -1 2 2
问题分析&实现思路
单调递增栈:在保持栈内元素单调递增的前提下(如果栈顶元素大于要入栈的元素,将将其弹出),将新元素入栈。
单调递减栈:在保持栈内元素单调递减的前提下(如果栈顶元素小于要入栈的元素,则将其弹出),将新元素入栈。
这里转载别人的解释https://www.acwing.com/solution/content/13981/
AC代码
#include <iostream>
using namespace std;
const int N = 100010;
int stack[N], top = -1;
int main()
{
int n, x;
scanf("%d", &n);
while (n -- )
{
scanf("%d", &x);
// 栈不空 并且 栈顶元素大于当前数 则弹出
while(top != -1 && stack[top] >= x) top --;
if(top == -1)
printf("-1 ");
else
printf("%d ", stack[top]);
stack[++ top] = x;
}
return 0;
}