📅  最后修改于: 2020-10-15 00:57:02             🧑  作者: Mango
我们可以使用线性数组轻松表示队列。每个队列都有两个变量,即前和后。前后变量指向在队列中执行插入和删除操作的位置。最初,front和queue的值为-1,表示一个空队列。下图显示了包含5个元素以及相应的前后值的队列的数组表示形式。
上图显示了构成英语单词“ HELLO”的字符队列。由于到目前为止尚未在队列中执行删除操作,因此front的值保持为-1。但是,每次在队列中执行插入操作时,后方的值将增加一。将元素插入上图所示的队列后,该队列将如下所示。 Rear的值将变为5,而front的值保持不变。
删除元素后,front的值将从-1增加到0。但是,队列看起来像以下。
通过比较后方与最大值-1来检查队列是否已满。如果是,则返回溢出错误。
如果要将该项目作为列表中的第一个元素插入,则在这种情况下,将front和tail的值设置为0,然后将元素插入后端。
否则,请继续增加Rear的值,并将每个元素逐一插入,以Rear为索引。
void insert (int queue[], int max, int front, int rear, int item)
{
if (rear + 1 == max)
{
printf("overflow");
}
else
{
if(front == -1 && rear == -1)
{
front = 0;
rear = 0;
}
else
{
rear = rear + 1;
}
queue[rear]=item;
}
}
如果front的值是-1或front的值大于Rear,则写下溢消息并退出。
否则,请继续增加front的值,并每次返回存储在队列前端的项目。
int delete (int queue[], int max, int front, int rear)
{
int y;
if (front == -1 || front > rear)
{
printf("underflow");
}
else
{
y = queue[front];
if(front == rear)
{
front = rear = -1;
else
front = front + 1;
}
return y;
}
}
#include
#include
#define maxsize 5
void insert();
void delete();
void display();
int front = -1, rear = -1;
int queue[maxsize];
void main ()
{
int choice;
while(choice != 4)
{
printf("\n*************************Main Menu*****************************\n");
printf("\n=================================================================\n");
printf("\n1.insert an element\n2.Delete an element\n3.Display the queue\n4.Exit\n");
printf("\nEnter your choice ?");
scanf("%d",&choice);
switch(choice)
{
case 1:
insert();
break;
case 2:
delete();
break;
case 3:
display();
break;
case 4:
exit(0);
break;
default:
printf("\nEnter valid choice??\n");
}
}
}
void insert()
{
int item;
printf("\nEnter the element\n");
scanf("\n%d",&item);
if(rear == maxsize-1)
{
printf("\nOVERFLOW\n");
return;
}
if(front == -1 && rear == -1)
{
front = 0;
rear = 0;
}
else
{
rear = rear+1;
}
queue[rear] = item;
printf("\nValue inserted ");
}
void delete()
{
int item;
if (front == -1 || front > rear)
{
printf("\nUNDERFLOW\n");
return;
}
else
{
item = queue[front];
if(front == rear)
{
front = -1;
rear = -1 ;
}
else
{
front = front + 1;
}
printf("\nvalue deleted ");
}
}
void display()
{
int i;
if(rear == -1)
{
printf("\nEmpty queue\n");
}
else
{ printf("\nprinting values .....\n");
for(i=front;i<=rear;i++)
{
printf("\n%d\n",queue[i]);
}
}
}
输出:
*************Main Menu**************
==============================================
1.insert an element
2.Delete an element
3.Display the queue
4.Exit
Enter your choice ?1
Enter the element
123
Value inserted
*************Main Menu**************
==============================================
1.insert an element
2.Delete an element
3.Display the queue
4.Exit
Enter your choice ?1
Enter the element
90
Value inserted
*************Main Menu**************
===================================
1.insert an element
2.Delete an element
3.Display the queue
4.Exit
Enter your choice ?2
value deleted
*************Main Menu**************
==============================================
1.insert an element
2.Delete an element
3.Display the queue
4.Exit
Enter your choice ?3
printing values .....
90
*************Main Menu**************
==============================================
1.insert an element
2.Delete an element
3.Display the queue
4.Exit
Enter your choice ?4
尽管创建队列的技术很容易,但是使用此技术实现队列存在一些缺点。
上图显示了如何在队列的数组表示中浪费内存空间。在上图中,显示了大小为10的具有3个元素的队列。 front变量的值为5,因此,我们不能在front位置之前将值重新插入到已删除元素的位置。数组的大量空间被浪费了,将来无法使用(用于此队列)。
数组实现最常见的问题是需要提前声明的数组大小。由于可以根据问题在运行时扩展队列,因此数组大小的扩展是一个耗时的过程,并且由于发生了许多重新分配,因此几乎不可能在运行时执行。由于这个原因,我们可以声明足够大的数组,以便我们可以存储尽可能多的队列元素,但是此声明的主要问题是,大多数数组插槽(近一半)永远无法重用。它将再次导致内存浪费。