写在前面
蒟蒻发第二篇博客了!
作者依然是个新手,依然没有脑子,因此本文可能存在大量不足之处,还请多多指教。对于各种错误,欢迎批评指正!
队列
队列(Queue
),是一种数据结构,在STL中可直接调用。具体地来说,队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。这也是其与栈的最大区别。队列的数据呈先进先出,正如排队,“队列”因此得名。
与栈相类似,队列也有push
、pop
等操作。push
是将元素插入队列的过程,称“入队”。
而pop
则是将队列最前元素删去的过程,称“出队”。
与栈不同的是,队列向外弹出元素时,是从最底端弹出。这一元素通常称front
。
废话不多说(虽然已经说了很多),直接切入正题
首先,依然是用数组实现:
const int MAXN=105;//演示专用数据
int queue[MAXN],head=0,tail=0;//head,tail分别表示队列前端(删除端)和后端(插入段)
随后,是push
实现:
void push(int x)
{
if((tail+1)%MAXN==head)//为防止队列假溢出,使用循环队列。该方法可判断队列是否已满。
{
cout<<"The queue is full!";//输出队列满告警信号
return;
}
queue[tail]=x;//未满则尾端赋值
tail=(tail+1)%MAXN;//实现循环队列
}
pop
的实现过程:
void pop()
{
if(head==tail)//循环队列下判断栈空
{
cout<<"The queue is empty!";//输出栈空告警
return;
}
head=(head+1)%MAXN;//头指针加1取余,使之在循环队列中向后挪动一位
}
front
的实现过程:
int front()
{
if(head==tail)//循环队列下判断栈空
{
cout<<"The queue is empty!"; //输出栈空告警
return -1;
}
return queue[head];//返回头端值
}
请注意
-
队列必须用循环队列,否则可能假溢出!!!
-
使用循环队列的方法:在
head
和tail
变量自增时取余MAXN
即可。 -
判断栈空时,需要判断的是
head
和tail
是否相等;而判断栈满时,则要看(tail+1)%MAXN
与head
的关系
完整代码
//Queue队列
#include<iostream>
using namespace std;
const int MAXN=105;
int queue[MAXN],head=0,tail=0;
void push(int x)
{
if((tail+1)%MAXN==head)
{
cout<<"The queue is full!";
return;
}
queue[tail]=x;
tail=(tail+1)%MAXN;
}
void pop()
{
if(head==tail)
{
cout<<"The queue is empty!";
return;
}
head=(head+1)%MAXN;
}
int front()
{
if(head==tail)
{
cout<<"The queue is empty!";
return -1;
}
return queue[head];
}
int main()
{
//进行需要的操作
return 0;
}