STL之stack

c++ STL之stack


1.介绍

栈是数据结构的一种,特点是先进后出。

头文件

#include<stack>

当然也可以使用c++的万能头文件

#include<bits/stdc++.h>

stack的声明

stack<int> stk//定义了一个储存int类型的栈
stack<char> stk//储存char类型
stack<node> stk//储存结构体类型的栈,要先定义一个node的结构体

2.函数

代码解释
stk.pop()弹出栈顶元素
stk.push(val)入栈,增加元素
stk.top()获得栈顶元素的值,但不删除
stk.empty()检查栈是否为空,空则返回true
stk.size()返回栈的元素个数

3.栈的遍历操作

stack<int> stk;
for(int i=0;i<5;i++){
    stk.push(i);
}
while(!stk.empty()){
    int top=stk.top();
    stk.pop();
}

4.利用stack解题

以信息学奥赛一本通的字符串匹配问题为例(此处引用了君义的代码):

[题目地址](信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn))

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int pri[128];//pri[i]:字符i的优先级
void initPri()//初始化括号的优先级
{//左括号都是正数,右括号都是负数,配对的括号的优先级互为相反数 
	pri['<'] = 1;
	pri['('] = 2;
	pri['['] = 3;
	pri['{'] = 4; 
	pri['>'] = -1;
	pri[')'] = -2;
	pri[']'] = -3;
	pri['}'] = -4;
}
void solve()//求解一组数据 
{
	stack<char> stk;
	string s;
	cin >> s;
	for(int i = 0; i < s.length(); ++i)
	{
		if(pri[s[i]] > 0)//如果s[i]是左括号 
		{
			if(stk.empty())
				stk.push(s[i]);
			else 
			{
				if(pri[s[i]] <= pri[stk.top()])
					stk.push(s[i]);
				else
				{
					cout << "NO" << endl;
					return;
				}
			}
		}
		else//如果s[i]是右括号 
		{
			if(stk.empty())
			{
				cout << "NO" << endl;
				return;
			}
			else
			{
				if(pri[s[i]] + pri[stk.top()] == 0)
					stk.pop();
				else
				{
					cout << "NO" << endl;
					return;
				}
			}
		}
	}
	if(stk.empty())
		cout << "YES" << endl;
	else
		cout << "NO" << endl;
}
int main()
{
	initPri();
	int n;
	cin >> n;
	while(n--)
		solve();
	return 0;
}

以上是stack的一些常见用法,还有一些具体的解释不是很到位,以其其他函数我没有枚举,可以看其他博客继续学习,欢迎批评与指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值