使用 C 的 DSA - 队列
概述
队列是一种类似于堆栈的数据结构,主要区别在于插入的第一个项目是第一个被移除的项目(FIFO - 先进先出),而堆栈基于 LIFO,后进先出原则。
队列表示
基本操作
插入/入队 − 将一个项目添加到队列的后面。
移除/出队 − 从队列的前面移除一个项目。
我们将在本文中使用数组实现队列。队列支持以下几个操作。
Peek − 获取队列前面的元素。
isFull − 检查队列是否已满。
isEmpty − 检查队列是否为空。
插入/入队操作
每当将元素插入队列时,队列都会增加后索引以供以后使用,并将该元素存储在存储的后端。如果后端到达最后一个索引,它将被包装到底部位置。这种安排称为环绕,这种队列是循环队列。此方法也称为入队操作。
void insert(int data){
if(!isFull()){
if(rear == MAX-1){
rear = -1;
}
intArray[++rear] = data;
itemCount++;
}
}
移除/出队操作
每当要从队列中移除元素时,队列都会使用前索引获取元素并增加前索引。作为环绕式安排,如果前索引大于数组的最大索引,则将其设置为 0。
int removeData(){
int data = intArray[front++];
if(front == MAX){
front = 0;
}
itemCount--;
return data;
}
示例
QueueDemo.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()){
if(rear == MAX-1){
rear = -1;
}
intArray[++rear] = data;
itemCount++;
}
}
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!
");
}
// remove one item
int num = removeData();
printf("Element removed: %d
",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
",peek());
printf("----------------------
");
printf("index : 5 4 3 2 1 0
");
printf("----------------------
");
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

