首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C中创建FIFO队列

在C语言中,创建FIFO(先进先出)队列通常可以通过以下步骤实现:

  1. 定义队列结构体:首先,定义一个队列结构体,包含队列的头指针、尾指针、队列长度和队列容量等信息。
代码语言:c
复制
typedef struct Queue {
    int front;
    int rear;
    int size;
    int capacity;
    int *array;
} Queue;
  1. 初始化队列:接下来,定义一个函数来初始化队列。这个函数需要分配内存空间,并将队列的头指针、尾指针和长度等信息初始化为0。
代码语言:c
复制
Queue* createQueue(int capacity) {
    Queue *queue = (Queue *)malloc(sizeof(Queue));
    queue->capacity = capacity;
    queue->front = queue->size = 0;
    queue->rear = capacity - 1;
    queue->array = (int *)malloc(queue->capacity * sizeof(int));
    return queue;
}
  1. 入队操作:定义一个函数来实现入队操作。在这个函数中,首先检查队列是否已满,如果已满则无法入队。然后将元素添加到队列的尾部,并更新队列的长度和尾指针。
代码语言:c
复制
void enqueue(Queue *queue, int data) {
    if (isFull(queue)) {
        printf("Queue is full. Cannot enqueue %d\n", data);
        return;
    }
    queue->rear = (queue->rear + 1) % queue->capacity;
    queue->array[queue->rear] = data;
    queue->size++;
}
  1. 出队操作:定义一个函数来实现出队操作。在这个函数中,首先检查队列是否为空,如果为空则无法出队。然后从队列的头部删除元素,并更新队列的长度和头指针。
代码语言:c
复制
int dequeue(Queue *queue) {
    if (isEmpty(queue)) {
        printf("Queue is empty. Cannot dequeue\n");
        return -1;
    }
    int data = queue->array[queue->front];
    queue->front = (queue->front + 1) % queue->capacity;
    queue->size--;
    return data;
}
  1. 销毁队列:最后,定义一个函数来销毁队列。这个函数需要释放队列结构体中的内存空间,并将队列指针设置为NULL。
代码语言:c
复制
void deleteQueue(Queue *queue) {
    free(queue->array);
    free(queue);
    queue = NULL;
}

通过以上步骤,可以在C语言中创建一个FIFO队列。这个队列可以用于各种应用场景,例如操作系统中的进程调度、数据传输等。在实际应用中,可以根据需要对队列进行扩展和优化。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

队列(常用数据结构之一)

那么a1为对头元素,an为队尾元素。最早进入队列的元素也会最早出来,只有当最先进入队列的元素都出来以后,后进入的元素才能退出。 在日常生活中,人们去银行办理业务需要排队,这就类似我们提到的队列。每一个新来办理业务的需要按照机器自动生成的编号等待办理,只有前面的人办理完毕,才能轮到排在后面的人办理业务。新来的人进入排队状态就相当于入队,前面办理完业务离开的就相当于出队。队列有两种存储表示:顺序存储和链式存储。采用顺序存储结构的队列被称为顺序队列,采用链式存储结构的队列称为链式队列。 基本运算 InitQueue() ——初始化队列 EnQueue() ——进队列 DeQueue() ——出队列 IsQueueEmpty() ——判断队列是否为空 IsQueueFull() ——判断队列是否已满 顺序队列 由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素。 队列为空时,队头指针front和队尾指针rear都指向下标为0的存储单元,当元素a,b,c,d,e,f,g依次进入队列后,元素a~g分别存放在数组下标为0~6的存储单元中,队头指针front指向元素a,队尾指针指rear向元素g的下一位置。如图所示。

01

期末复习之数据结构 第3章 栈和队列

五:写出下列程序段的输出结果(栈的元素类型SElem Type为char)。 1.void main( ){ Stack S; Char x,y; InitStack(S); X=’c’;y=’k’; Push(S,x); Push(S,’a’); Push(S,y); Pop(S,x); Push(S,’t’); Push(S,x); Pop(S,x); Push(S,’s’); while(!StackEmpty(S)){ Pop(S,y);printf(y); }; Printf(x); } 答:输出为“stack”。 2.【严题集3.12②】写出下列程序段的输出结果(队列中的元素类型QElem Type为char)。 void main( ){ Queue Q; Init Queue (Q); Char x=’e’; y=’c’; EnQueue (Q,’h’); EnQueue (Q,’r’); EnQueue (Q, y); DeQueue (Q,x); EnQueue (Q,x); DeQueue (Q,x); EnQueue (Q,’a’); while(!QueueEmpty(Q)){ DeQueue (Q,y);printf(y); }; Printf(x); } 答:输出为“char”。 3.【严题集3.13②】简述以下算法的功能(栈和队列的元素类型均为int)。 void algo3(Queue &Q){ Stack S; int d; InitStack(S); while(!QueueEmpty(Q)){ DeQueue (Q,d); Push(S,d); }; while(!StackEmpty(S)){ Pop(S,d); EnQueue (Q,d); } } 答:该算法的功能是:利用堆栈做辅助,将队列中的数据元素进行逆置。

02

(全网首发)循环队列字符串入队出队

上次上机题,循环队列入队出队,给了尾指针和长度,虽然算法有些复杂,但还是比较容易能想到。 不过在给朱老师验收的时候,老师竟然问了一个问题:不是数字,改成字符串行不行? 一开始我以为很简单,不就是改个数据类型的事,结果打脸了,在机房搞了几小时都没整出来。 没想到,仅仅这么微小的改动,难度天差地别。 一行数字,用个int完全能容纳,如果是一串字符,不仅仅是char,而是字符串! C没有字符串的str类型,所以就必须用到字符串数组指针。 其中有个坑 我用定义*char【10】;之后char【10】=“123”,放在循环之中莫名失效,改成strcpy后才成功。(到目前为止这点我还没完全想通,知道的可以在评论区指点指点) 还有个坑,连续scanf读取的时候,会把回车读进去,这时候需要及时清除键盘缓冲区fflush(stdin);

02
领券