服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言简明讲解队列的实现方法

C语言简明讲解队列的实现方法

2022-11-14 13:30平凡的人1 C/C++

队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素

前言

大家好啊,我又双叒叕来水博客了,道路是曲折的,前途是光明的,事物是呈螺旋式上升的,事物最终的发展结果还是我们多多少少能够决定的,好啦,吹水结束,这与这篇博客的主题并没有太多联系。关于栈和队列这一板块本来是想不写(就是想偷懒),但是想了想,觉得这样不太好,关于数据结构这一块可能会有缺失,所以最终还是决定写,必须补齐这一块,恰好最近有时间写博客,所以还是写了,这篇博客将介绍队列的知识点,理解链表那一块的操作后,栈和队列的相关操作还是比较容易去理解的。

队列的表示和实现

队列的概念及结构

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First in First Out)

入队列:进行插入操作的一端称为队尾

出队列:进行删除操作的一端称为队头

敲黑板,开始摸鱼:

其实也没什么重点啦,都是一些基本的概念性东西,主要有:

1.要理解FIFO代表的意思

2.什么是队尾队头,别弄混了

C语言简明讲解队列的实现方法

队列的实现有两种方法:

数组:不适合,队头出数据需要挪动数据,一般还会出现假溢出,循环队列啥的

链表:单链表较合适,头删尾插,效率较高

当然,并不是说一定要用哪种,由于课本是以数组为例,这里以单链表为例

代码实现

还是老样子,分为三部分,直接上手代码,来,跟着我一起敲

Queue.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma once
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
#include <stdlib.h>
typedef int QDataType;
typedef struct QueueNode
{
    struct QueueNode* next;
    QDataType data;
}QNode;
 typedef struct Queue
{
    QNode* head;
    QNode* tail;
}Queue;
 //初始化
 void QueueInit(Queue* pq);
 //销毁
 void QueueDestory(Queue* pq);
 //队尾入
 void QueuePush(Queue* pq, QDataType x);
 //队头出
 void QueuePop(Queue* pq);
 //取队头数据
 QDataType QueueFront(Queue* pq);
 //取队尾数据
 QDataType QueuBack(Queue* pq);
 //个数
 int QueueSize(Queue* pq);
 //判断是否为空
 bool QueueEmpty(Queue* pq);

Queue.c

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "Queue.h"
void QueueInit(Queue* pq)
{
    assert(pq);
    pq->head = pq->tail = NULL;
}
void QueueDestory(Queue* pq)
{
    assert(pq);
    QNode* cur = pq->head;
    while (cur)
    {
        QNode* next = cur->next;
        free(cur);
        cur = next;
    }
    pq->head = pq->tail = NULL;
}
//队尾入
void QueuePush(Queue* pq, QDataType x)
{
    assert(pq);
    QNode* newnode = (QNode*)malloc(sizeof(QNode));
    if (newnode == NULL)
    {
        printf("malloc fail\n");
        exit(-1);
    }
    newnode->data = x;
    newnode->next = NULL;
    if (pq->tail == NULL)
    {
        pq->head = pq->tail = newnode;
    }
    else
    {
        pq->tail->next = newnode;
        pq->tail = newnode;
    }
}
//队头出
void QueuePop(Queue* pq)
{
    assert(pq);
    assert(pq->head);
    //1.一个(防止野指针)
    //2.多个
    if (pq->head->next == NULL)
    {
        free(pq->head);
        pq->head = pq->tail = NULL;
    }
    else
    {
        QNode* next = pq->head->next;
        free(pq->head);
        pq->head = next;
    }
}
QDataType QueueFront(Queue* pq)
{
    assert(pq);
    assert(pq->head);
    return pq->head->data;
}
QDataType QueuBack(Queue* pq)
{
    assert(pq);
    assert(pq->head);
    return pq->tail->data;
}
int QueueSize(Queue* pq)
{
    assert(pq);
    int size = 0;
    QNode* cur = pq->head;
    while (cur)
    {
        ++size;
        cur = cur->next;
    }
    return size;
}
bool QueueEmpty(Queue* pq)
{
    assert(pq);
    return pq->head == NULL;
}

Test.c

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "Queue.h"
void TestQueue()
{
    Queue q;
    QueueInit(&q);
    QueuePush(&q, 1);
    QueuePush(&q, 2);
    printf("%d ", QueueFront(&q));
    QueuePop(&q);
    QueuePush(&q, 3);
    QueuePush(&q, 4);
    while (!QueueEmpty(&q))
    {
        printf("%d ", QueueFront(&q));
        QueuePop(&q);
    }
    printf("\n");
    QueueDestory(&q);
}
int main()
{
    TestQueue();
    return 0;
}

束语

关于堆栈和队列的相关操作就说到这里了,如果对你有帮助的话,那就点个赞把!

到此这篇关于C语言简明讲解队列的实现方法的文章就介绍到这了,更多相关C语言队列内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_60478154/article/details/124133722

延伸 · 阅读

精彩推荐
  • C/C++C++实现简易版扫雷游戏

    C++实现简易版扫雷游戏

    大家好,本篇文章主要讲的是C++实现简易版扫雷游戏,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下...

    风影6666611502022-08-24
  • C/C++用C语言实现简单的计算器功能

    用C语言实现简单的计算器功能

    这篇文章主要为大家详细介绍了用C语言实现简单的计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    风叶翩翩6982022-09-08
  • C/C++详解C语言结构体中的char数组如何赋值

    详解C语言结构体中的char数组如何赋值

    这篇文章主要给大家介绍了关于C语言结构体中的char数组如何赋值的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习...

    北极的大企鹅11192022-10-12
  • C/C++使用C语言实现本地socket通讯的方法

    使用C语言实现本地socket通讯的方法

    这篇文章主要介绍了 使用C语言实现本地socket通讯,代码分为服务器代码和客户端代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要...

    飘杨......9692022-07-20
  • C/C++C++ decltype类型说明符

    C++ decltype类型说明符

    在C++中,decltype作为操作符,用于查询表达式的数据类型。decltype在C++11标准制定时引入,主要是为泛型编程而设计,以解决泛型编程中,由于有些类型由模...

    C++教程网12462021-03-27
  • C/C++C++实现双向循环链表

    C++实现双向循环链表

    这篇文章主要为大家详细介绍了C++实现双向循环链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    ChanJose7472021-09-02
  • C/C++C++ DLL注入工具(完整源码)

    C++ DLL注入工具(完整源码)

    这篇文章主要介绍了C++ DLL注入工具的相关资料,并向大家分享了完整的源码,具有一定的参考价值,希望对正在工作或学习的你有所帮助...

    乔安生5222022-09-14
  • C/C++主流操作系统平台的宏定义

    主流操作系统平台的宏定义

    这篇文章主要介绍了主流操作系统平台的宏定义,最近正在学习C++程序从Windows 平台向Unix 平台移植,参考了 qt 的宏定义文件,需要的朋友可以参考下...

    C语言程序设计5912021-01-16