c - 通过数组实现线性队列

标签 c data-structures queue

我通过数组实现制作了一个线性队列数据结构。

在线性队列数据结构中,元素从前面插入,从后面删除。
一般来说,当后面的元素位于数组的最后一个索引时,即使前面有地方可以容纳更多元素,我们也会显示溢出消息。

为此,我提出了一种解决方案,每次执行删除操作时,我都会通过循环操作将每个元素移动一个位置。

但是当我在互联网上搜索线性队列的数组实现时,甚至没有一个解决方案实现这种方法。即使在 geeksforgeeks 中他们也没有使用过这种方法。由于这种方法的应用显而易见,为什么没有任何标准解决方案应用它。

它会增加程序的时间复杂度吗?

#include<stdio.h>
#include<stdlib.h>
//the MAX is defined for array size
#define MAX 5
int q[MAX];
//here r indicates the index of last element in queue
int r=-1;
//function to insert element in queue
void insert();
//function to delete an element from queue
int delet();
//function to delete all the elements from the queue
void traverse();
int main()
{
    int choice;
    int value;
    printf("in 1\n");
    while(1)
    {
        printf("1. To insert an element to queue\n");
        printf("2. To delete an element from queue\n");
        printf("3. To delete all the elements from queue\n");
        printf("4. To Exit\n");
        printf("enter choice\n");
        scanf("%d",&choice);
        switch(choice)
        {
            case 1:insert();
                   break;
            case 2:value=delet();
                   value==-1?printf("queue is empty\n"):printf("the  
                   deleted element is %d\n",value);
                   break;
            case 3:traverse();
                   break;
            case 4:exit(0);
            default:printf("Enter a valid choice\n");
         }
    }
}
void insert()
{
    int item;
    //this is the condition for overflow
    if(r==MAX-1)
        printf("queue is full\n");
    else
    {
        printf("Enter item other than -1\n");
        scanf("%d",&item);
        r=r+1;
        q[r]=item;
    }
}
int delet()
{
    int temp,i;
    if(r==-1)
        return -1;
    else
    {
        temp = q[0];
        for(i=0;i<r;i++)
            q[i]=q[i+1];
        r=r-1;
        return temp;
    }
}
void traverse()
{
    int i;
    for(i=0;i<=r;i++)
        printf("%d\n",q[i]);
}

最佳答案

您的方法的问题在于需要进行大量处理才能将所有内容上移一位。在您的 delet 函数中,您有以下代码:

{
    temp = q[0];
    for(i=0;i<r;i++)
        q[i]=q[i+1];
    r=r-1;
    return temp;
}

现在,假设队列中有 100 万个项目。当您从队列中删除一个项目时,您必须将 999,999 个项目向上移动一位。从计算机角度来说,这将需要很长时间。

就算法复杂度而言,从循环队列中删除是一个 O(1) 操作:无论队列中有多少项,它都需要相同的时间。您的删除方法是一个 O(n) 操作:删除项目所需的时间与队列中项目的数量成正比。

从功能上来说,您的实现没有任何问题。但从性能的角度来看,你的实现会比循环队列慢得多。对于小型测试程序,您不会注意到这一点,但是当您开始向队列添加数千或数百万个内容时,您的代码可能会慢得令人无法接受:比循环队列慢数千倍。

关于c - 通过数组实现线性队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45999891/

相关文章:

java - 在Java中使用for循环创建映射时,Kep的值始终保持为0

azure - 是否有任何特定方法可以在一个 http 请求中从 Azure 存储队列获取超过 32 条消息

java - Flex AMF Remoting 请求到 Java 服务器的排队策略

Cortex-M4 锁定

JavaScript数据结构解释

c - 在 C 中的结构中模拟两个灵活数组的结构

javascript - queue.js 是如何工作的?

c - 父进程无限循环使用fork()后不更新屏幕

C – 将可变数量的参数传递给 main

c - 我无法理解以下作业