1、栈的介绍
栈是一种后进先出(Last in first out, LIFO)的线性表,即后进入的先出来,其限制是只能在栈的一段进行插入和删除操作
2、栈的基本操作
1、入栈:在栈顶插入一个元素
2、出栈:弹出栈顶元素
3、C++ STL中的stack
1、定义一个栈:
stack<数据类型> 栈名;
2、stack的成员函数:
push(x);//栈顶加x,无返回值
pop();//弹出栈顶,无返回值
top();//返回栈顶
empty();//返回栈是否为空,空栈返回true、1
size();//返回栈元素的数量
```
//例
include<stack>
stack<int> sta;
sta.push(1);
sta.push(2);
sta.size();//2
sta.top();//2
sta.empty();//0
sta.pop();
sta.size();//1
```
4、出栈序列
1.n个不同元素进栈,元素不同排列的个数为: (1/(n+1)) * ( C 2n, n )
2、当入栈序列固定时,任意给定一个出栈序列如何判断是否合法:
```
//循环遍历出栈序列,对于出栈序列的每一个元素
if(元素在栈里)
{
if(在栈里)
{
出栈;
}
else
{
说明出栈序列不合法;
}
}
else//元素不在栈里
{
1、先持续入栈,直到当前元素在栈里
2、出栈
}
//循环遍历后,没有不合法,那么就是合法
```
```
#include<bits/stdc++.h>
using namespace std;
int main()
{
//例:入栈序列固定为1~n,输入一个出栈序列,判断是否合法
bool mark[100001] = {};//下标元素在不在栈里
int poped[100001] = {};//出栈序列
stack <int> sta;
int n = 0, x = 0;//x表示当前要入栈的数
cin >> n;
for(int i = 1; i <= n; i++)
{
cin >> poped[i];
}
for(int i = 1; i <= n; i++)
{
//判读poped[i]在不在栈里
if(mark[poped[i]] == 1)
{
if(poped[i] == sta.top())
{
sta.pop();
mark[poped[i]] = 0;
}
else
{
cout << "False";
return 0;
}
}
else
{
while(mark[poped[i]] == 0)//持续入栈
{
sta.push(x);
mark[x] = 1;
x++;
}
sta.pop();
mark[poped[i]] = 0;
}
}
cout<<"Ture";
return 0;
}