队列Queue是一种抽象的数据结构,有点类似于堆栈,与堆栈不同,队列的两端都是打开的。一端始终用于插入数据(入队),另一端用于删除数据(出队)。队列遵循先进先出方法,即首先访问的数据项将首先被访问。

队列的真可以是单车道单向道路,车辆首先进入,然后首先离开。在售票窗口和公交车站的队列中,可以看到更多实际示例。
队列表示
现在我们知道在队列中,出于不同的原因访问两端。下面给出的下图试图将队列表示解释为数据结构-

与在堆栈中一样,也可以使用数组,链接列表,指针和结构来实现队列。为了简单起见,我们将使用一维数组实现队列。
基本操作
队列操作可能涉及初始化或定义队列,利用它,然后从内存中完全擦除它。在这里,我们将尝试了解与队列相关的基本操作-
enqueue() - 将数据添加到队列中。
dequeue() - 从队列中删除数据。
peek() - 将元素获取到队列的最前面而不删除它。
isfull() - 检查队列是否已满。
isempty() - 检查队列是否为空。
首先让我们了解队列的这些函数-
Peek() - 函数有助于查看队列前面的数据。peek()函数的算法如下
begin procedure peek return queue[front] end procedure
用C编程语言实现peek()函数-
int peek() { return queue[front]; }
isfull() - 当我们使用单维数组实现队列时,我们只需检查后指针达到MAXSIZE即可确定队列已满。isfull()函数的算法-
begin procedure isfullif rear equals to MAXSIZE return true else return false endif
end procedure
用C编程语言实现isfull()函数-
bool isfull() { if(rear == MAXSIZE - 1) return true; else return false; }
isempty() - 函数的算法-
begin procedure isemptyif front is less than MIN OR front is greater than rear return true else return false endif
end procedure
如果 front 的值小于MIN或0,则表明队列尚未初始化,因此为空。
这是C编程代码-
bool isempty() { if(front < 0 || front > rear) return true; else return false; }
入队操作
队列维护两个数据指针,分别为 front 和 rear 。因此,它的操作比堆栈的实现相对困难。
应该采取以下步骤将数据排队(插入)到队列中-
步骤1 - 检查队列是否已满。
步骤2 - 如果队列已满,则产生溢出错误并退出。
步骤3 - 如果队列未满,请增加后指针以指向下一个空白空间。
步骤4 - 将数据元素添加到后方指向的队列位置。
步骤5 - 返回成功。

有时,我们还会检查队列是否已初始化,以处理任何无法预料的情况。
入队操作算法
procedure enqueue(data)if queue is full return overflow endif
rear ← rear + 1 queue[rear] ← data return true
end procedure
enqueue()在C编程语言中的实现-
int enqueue(int data) if(isfull()) return 0;rear = rear + 1; queue[rear] = data;
return 1; end procedure
出队操作
从队列访问数据是两个任务的进程-访问 front 所指向的数据并在访问后删除数据。采取以下步骤执行出队操作-
步骤1 - 检查队列是否为空。
步骤2 - 如果队列为空,则产生下溢错误并退出。
步骤3 - 如果队列不为空,请访问 front 所指向的数据。
步骤4 - 递增 front 指针以指向下一个可用数据元素。
步骤5 - 返回成功。

出队操作算法
procedure dequeue
if queue is empty
return underflow
end if
data = queue[front]
front ← front + 1
return true
end procedure
用C编程语言实现dequeue()-
int dequeue() { if(isempty()) return 0;int data = queue[front]; front = front + 1;
return data; }
C语言完整程序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 6
int intArray[MAX];
int front = 0;
int rear = -1;
int itemCount = 0;
int peek() {
return intArray[front];
}
bool isEmpty() {
return itemCount == 0;
}
bool isFull() {
return itemCount == MAX;
}
int size() {
return itemCount;
}
void insert(int data) {
if(!isFull()) {
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">rear </span><span class="pun">==</span><span class="pln"> MAX</span><span class="pun">-</span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
rear </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
intArray</span><span class="pun">[++</span><span class="pln">rear</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
itemCount</span><span class="pun">++;</span><span class="pln">
}
}
int removeData() {
int data = intArray[front++];
if(front == MAX) {
front = 0;
}
itemCount--;
return data;
}
int main() {
/* insert 5 items */
insert(3);
insert(5);
insert(9);
insert(1);
insert(12);
// front : 0
// rear : 4
// ------------------
// index : 0 1 2 3 4
// ------------------
// queue : 3 5 9 1 12
insert(15);
// front : 0
// rear : 5
// ---------------------
// index : 0 1 2 3 4 5
// ---------------------
// queue : 3 5 9 1 12 15
if(isFull()) {
printf("Queue is full!\n");
}
// remove one item
int num = removeData();
printf("Element removed: %d\n",num);
// front : 1
// rear : 5
// -------------------
// index : 1 2 3 4 5
// -------------------
// queue : 5 9 1 12 15
// insert more items
insert(16);
// front : 1
// rear : -1
// ----------------------
// index : 0 1 2 3 4 5
// ----------------------
// queue : 16 5 9 1 12 15
// As queue is full, elements will not be inserted.
insert(17);
insert(18);
// ----------------------
// index : 0 1 2 3 4 5
// ----------------------
// queue : 16 5 9 1 12 15
printf("Element at front: %d\n",peek());
printf("----------------------\n");
printf("index : 5 4 3 2 1 0\n");
printf("----------------------\n");
printf("Queue: ");
while(!isEmpty()) {
int n = removeData();
printf("%d ",n);
}
}
代码输出
Queue is full! Element removed: 3 Element at front: 5 ---------------------- index : 5 4 3 2 1 0 ---------------------- Queue: 5 9 1 12 15 16