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