【Linux C编程】第二十六章 如何在 C 中实现队列?
队列是存储元素集合的线性数据结构。队列采用先进先出 (FIFO) 算法。本文将帮助您探索 C 中的队列
本文将介绍以下指针,
- Analogy For Queue
- Operations On A Queue
- Sample Code For Queue In C
- Insert Function
- Delete Function
- Display Function
- Limitations Of This Implementation
那么让我们开始吧,
队列类比
您正在去看医生进行检查。诊所里有很多人。一位女士正在输入文件中所有人的姓名。先到的人先得到位置。当医生有空时,他把第一个病人叫进去。这是一个队列,遵循先进先出的方法,因为第一个在列表中输入他的名字的人首先得到处理。
从名单中删除以他们的名字对待的人。这就是队列的工作方式。
有2个指针,前面在队列的前面,后面在队列的后面。我们从队列的后面添加元素并从队列的前面删除它们。
队列操作
- 入队 - 如果队列中有空间,则在队列中添加一个元素。
- Dequeue - 如果队列中有任何元素,则从队列中删除元素
- Front- 从队列中获取第一项。
- 重新获取队列中的最后一项。
- isEmpty/isFull- 检查队列是空还是满。
应用
- 队列用于在 CPU 中调度进程。
- 它用于进程之间的数据传输。
- 它拥有多个作业,然后在需要时调用。
C 中队列的示例代码
#include <stdio.h>
#include<stdlib.h>
#define MAX 50
void insert();
void delete();
void display();
int queue_array[MAX];
int rear = - 1;
int front = - 1;
int main()
{
int choice;
while (1)
{
printf("1.Insert element to queue n");
printf("2.Delete element from queue n");
printf("3.Display all elements of queue n");
printf("4.Quit n");
printf("Enter your choice : ");
scanf("%d", &choice);
switch(choice)
{
case 1:
insert();
break;
case 2:
delete();
break;
case 3:
display();
break;
case 4:
exit(1);
default:
printf("Wrong choice n");
}
}
}
void insert()
{
int item;
if(rear == MAX - 1)
printf("Queue Overflow n");
else
{
if(front== - 1)
front = 0;
printf("Inset the element in queue : ");
scanf("%d", &item);
rear = rear + 1;
queue_array[rear] = item;
}
}
void delete()
{
if(front == - 1 || front > rear)
{
printf("Queue Underflow n");
return;
}
else
{
printf("Element deleted from queue is : %dn", queue_array[front]);
front = front + 1;
}
}
void display()
{
int i;
if(front == - 1)
printf("Queue is empty n");
else
{
printf("Queue is : n");
for(i = front; i <= rear; i++)
printf("%d ", queue_array[i]);
printf("n");
}
}
输出
解释
这段代码是一个菜单驱动的队列实现。首先,定义 MAX 变量的大小为 50。然后,声明名为 queue_array 的数组的大小为 MAX。需要声明三个函数。这些功能是插入、显示和删除功能。使用菜单驱动的主要功能。要求用户输入他的选择并调用适当的函数来执行任务。
有2个指针,前面在队列的前面,后面在队列的后面。我们从队列的后面添加元素并从队列的前面删除它们。
插入功能
void insert()
{
int item;
if(rear == MAX - 1)
{
printf("Queue Overflow n");
}
else
{
if(front == - 1)
{
front = 0;
printf("Inset the element in queue : ");
scanf("%d", &item);
rear = rear + 1;
queue_array[rear] = item;
}
}
}
在插入部分,首先声明一个要添加的项目。用户将输入该项目。检查队列是否已满,如果是则给出溢出消息,否则检查队列是否为空。然后后部增加一,并在位置后部添加新项目。
删除功能
void insert()
{
int item;
if (rear == MAX - 1)
{
printf("Queue Overflow n");
}
else
{
if (front == - 1)
{
front = 0;
printf("Inset the element in queue : ");
scanf("%d", &item);
rear = rear + 1;
queue_array[rear] = item;
}
}
}
在删除部分,再次检查队列是否为空。如果是,则打印下溢错误。否则,打印第一个元素,即将被删除的元素并增加前面的元素。这就是删除发生的方式。
显示功能
void display()
{
int i;
if(front == - 1)
{
printf("Queue is empty n");
}
else
{
printf("Queue is : n");
for(i = front; i <= rear; i++)
printf("%d ", queue_array[i]);
printf("n");
}
}
只需像数组一样显示队列。检查这里的队列是否也为空。队列的复杂度为 O(1),因为在任何操作中都不存在循环。
此实现的限制
考虑一个大小为 5 的队列。我们输入了 5 个元素,但后来删除了前 2 个元素。现在有一个问题。我们有空闲空间,但是空间不会被使用,因为我们不能再次遍历。使用循环队列解决了这个问题。
这使我们到了这篇关于 C 中的队列的文章的结尾。
- 点赞
- 收藏
- 关注作者
评论(0)