运用stack函数首先需要头文件#include<stack>,栈是先进后出
stack的常用函数:
- push()——向栈顶压入元素
- pop ()——弹出栈顶元素
- top ()——访问栈顶元素
- empty()——判断栈是否为空,为空是1
例题1:
题目描述
牛牛喜欢跟字符串玩耍,他刚刚学会了一个新操作,将一个字符串x插入另一个字符串y中(包括放在开头和结尾)
牛牛认为如果一个串是好的当这个串能按照如下方法被构造出来:
一开始,有一个空串,然后执行0次或者若干次操作,每次操作将ab插入当前的字符串
根据上面的定义,ab, aabb, aababb都是好串,aab,ba,abbb并不是好串
现在给你一个字符串s,判断s是否是好串
输入描述:
输入一行包含一个字符串,长度不超过50
输出描述:
输出"Good" 或者 "Bad"
示例1
输入
ab
输出
Good
示例2
输入
aab
输出
Bad
示例3
输入
abaababababbaabbaaaabaababaabbabaaabbbbbbbb
输出
Bad
#include<iostream>
#include<stack>
using namespace std;
string str;
stack<string> s;
int main()
{cin >> str;for (int i = 0; i < str.size(); i++){if (str[i] == 'a') //为a就入栈{s.push("a");}else {if (s.empty()) //为b时,栈又为空时,说明不是好串{cout << "Bad";return 0;}else //一个b就消去最前面的一个a{s.pop();//弹出栈顶}}}if (s.empty()) cout << "Good";//最后判断,若为空,则是好串else cout << "Bad";
}
例题2:
题目描述
给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
输入描述:
第一行一个数n 第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格
输出描述:
输出一行n个数表示答案,用空格隔开,结尾无空格
示例1
输入
5 2 1 5 3 4
输出
5 4 3 1 2
说明
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈
#include<iostream>
#include<stack>
using namespace std;
int n, a[1000010], maxn[1000010];
stack<int>st;
int main()
{int n;cin >> n;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = n; i >= 1; i--)maxn[i] = max(a[i], maxn[i + 1]);//判断该位元素以及之后最大元素for (int i = 1; i <= n; i++){st.push(a[i]);while (!st.empty() && st.top() > maxn[i + 1]){cout << st.top()<<" ";//访问栈顶元素st.pop();//弹出栈顶元素}}while (!st.empty())//不为空,则输出{cout << st.top()<<" ";st.pop();}}