C++ STL中stack栈(简单讲解+例题运用)

运用stack函数首先需要头文件#include,栈是先进后出

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
#include
using namespace std;
string str;
stack 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
#include
using namespace std;
int n, a[1000010], maxn[1000010];
stackst;
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();
	}

}

你可能感兴趣的:(c++,开发语言)