栈和队列
\color{red}{\huge{栈和队列}}
栈和队列
此处所提到的栈和队列数据结构都是用一维数组进行模拟的,并不是使用
S
T
L
STL
STL库中自带的数据结构。
栈
①. 结构特点
F I L O FILO FILO:先进后出,先进入的数据被压入栈底,后进入的数据压入栈顶,之后栈顶的数据优先弹出。
②. 构成组件
s
t
[
N
]
st[N]
st[N]:栈数组。
t
o
p
top
top:用于标明现在栈顶在什么位置的下标。
②. 经典操作
1. 初始化
模拟栈的初始化就是把 t o p top top赋值为 − 1 -1 −1。所以后来当进行插入操作的时候,应该先进行 + + t o p ++top ++top。
int st[N];
int top = -1;
2. 判断栈空
判断 t o p top top的值是不是 − 1 -1 −1即可。
if(top == -1)
cout << "Yes" << endl;
else
cout << "No" << endl;
3. 入栈
直接将数据压入栈中即可。
st[++top] = a;
4. 出栈
将数据弹出栈,这里也就是通过 ( t o p − − ) (top-\space -) (top− −)操作实现。
top--;
完整代码体现
#include <iostream>
using namespace std;
const int N = 100010;
int st[N];
int top = -1;
int n;
int main ()
{
cin >>n;
while(n--)
{
string s;
cin >> s;
if(s == "push")
{
int a;
cin >> a;
st[++top] = a;
}
if(s == "pop")
{
top--;
}
if(s == "query")
{
cout << st[top] << endl;
}
if(s == "empty")
{
cout << (top == -1 ? "YES" : "NO") << endl;
}
}
return 0;
}
队列
①. 结构特点
F I F O FIFO FIFO:先进先出结构特点。最先进入的数据,输出的时候一定最先出去。数据顺序进来就顺序出去。
②. 构成组件
q
[
N
]
q[N]
q[N]:用于模拟队列的数组。
h
h
hh
hh:队列的头指针。
t
t
tt
tt:队列的尾指针。
③. 基本操作
1. 队列初始化
模拟队列进行初始化的时候,将 h h hh hh和 t t tt tt都放置再同一初始位置 0 0 0下标的位置。
int q[N];
int tt;
int hh;
2. 判断队列是否为空
就是判断队头 h h hh hh是否等于队尾 t t tt tt(一般自己手动模拟队列的时候,开的数组空间都是很大的,不是很常用循环队列来进行空间压缩,并且使用循环队列条件判断也很复杂)
if(hh == tt)
cout << "Yes" << endl;
else
cout << "No" << endl;
3. 入队 P u s h Push Push
入队操作的时候从队尾 t t tt tt开始入队。
q[tt++] = x; //这里先进行tt++是因为tt初始化为的是0
4. 出队 P o p Pop Pop
出队操作是从队头 h h hh hh开始出队,具体体现为 h h + + hh+ \space + hh+ +。
hh++;
完整代码实现
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n;
int q[N]; //用于模拟队列的数组
int hh,tt; //hh代表队列的头指针,tt代表队列的尾指针
//初始的时候将tt与hh都放置在同一位置,也就是都放在0下标位置
int main ()
{
cin >> n;
while(n--)
{
string op;
cin >> op;
if (op == "push")
{
int x;
cin >> x;
//这里使用的是tt++,利用tt进行操作,体现出了队列元素入队的时候是从队尾入队的
q[tt++] = x;
}
else if(op == "pop")
{
//pop的时候,判断tt与hh的关系,若不等就将hh++
//意为队首元素出队
if(hh != tt)
{
hh++;
}
}
else if(op == "empty")
{
if(hh == tt)
{
cout <<"YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
else
{
cout << q[hh] << endl;
}
}
return 0;
}