• 链式队列----数据结构


    队列的基本概念

    队列是一种操作受限的线性表(先进先出),只允许在队尾插入,队头删除。

    例如去银行办理业务,肯定是先来的先出去,后来的人排在后方,只有第一个人业务办理完了,才会有一个人出队列。

    队列的实现

    结点和指针的定义

    1. #define MAX_SIZE 50
    2. typedef int DateElem; //队列中的元素类型
    3. typedef struct _QueueNode
    4. {
    5. DateElem date;
    6. struct _QueueNode* next; //和单链表结点的定义一样
    7. }QueueNode;
    8. typedef QueueNode* QueuePtr; //可以用QueuePtr创建一个指向结点的指针
    9. typedef struct LinkQueue //定义的是队列头、尾指针
    10. {
    11. int length; //存储队列的长度,因为要频繁获取长度
    12. QueuePtr head; //指向第一个结点,队头指针
    13. QueuePtr tail; //指向最后一个结点,队尾指针
    14. }Queue;

    初始化

    1. //初始化队列
    2. bool InitQueue(Queue* sq)
    3. {
    4. if (!sq) return false;
    5. sq->length = 0;
    6. sq->head = NULL; //置为空,最开始为空队列
    7. sq->tail = NULL;
    8. return true;
    9. }

    判断是否为空

    1. bool IsEmpty(Queue* sq)
    2. {
    3. if (!sq) return false;
    4. //头指针没有指向任何一个结点
    5. if (sq->head == NULL) //不能用 sq->head == sq->tail 来判断,因为队列只有一个元素时,头尾指针指向同一个结点,但是可以用 sq->head == sq->tail = NULL,意思是三个都相等
    6. {
    7. return true;
    8. }
    9. return false;
    10. }

    判断是否满了

    1. bool IsFull(Queue* sq)
    2. {
    3. if (!sq) return false;
    4. if (sq->length >= MAX_SIZE) //长度最开始为0,插入一个,长度 +1
    5. {
    6. return true;
    7. }
    8. return false;
    9. }

    插入(入队)

    1. bool EnterQueue(Queue* sq, DateElem *e)
    2. {
    3. if (!sq) return false;
    4. if (IsFull(sq)) return false; //队列满了,无法继续插入
    5. QueueNode *p = new QueueNode;
    6. p->date = *e;
    7. p->next = NULL; //因为是最后一个结点,没有直接后继
    8. if (IsEmpty(sq)) //空队列
    9. {
    10. sq->head = p;
    11. sq->tail = p;
    12. }
    13. else
    14. {
    15. //此时head指向第一个结点,tail指向最后一个结点
    16. sq->tail->next = p;
    17. sq->tail = p; //更新tail指针
    18. }
    19. sq->length++; //别忘记了
    20. return true;
    21. }

    删除(出队)

    1. bool PopQueue(Queue* sq,DateElem *date)
    2. {
    3. if (!sq || IsEmpty(sq)) return false;
    4. if (!date) return false;
    5. //此时head指向第一个结点,tail指向最后一个结点
    6. QueueNode* p = sq->head;
    7. sq->head = p->next; //head指向第二个结点
    8. *date = p->date; //返回删除的值
    9. delete p;
    10. //如果队列只有一个结点,而恰好刚刚删除了,也就是空队列
    11. if (IsEmpty(sq))
    12. {
    13. sq->head = NULL; //head已经为空,写一下更整齐(可以不用写)
    14. sq->tail = NULL;
    15. }
    16. sq->length--;
    17. return true;
    18. }

    打印队列

    1. bool Print(Queue* sq) //和链表的打印一样
    2. {
    3. if (!sq ) return false;
    4. if (IsEmpty(sq))
    5. {
    6. cout << "队列为空" << endl;
    7. }
    8. QueueNode* p = sq->head;
    9. cout << "队列中的元素:";
    10. while (p != NULL)
    11. {
    12. printf("%d ", p->date);
    13. p = p->next;
    14. }
    15. cout << endl;
    16. return true;
    17. }

    清空队列

    1. //清空队列
    2. bool ClearQueue(Queue* sq)
    3. {
    4. if (!sq || IsEmpty(sq)) return false;
    5. QueueNode* p = sq->head,*q = NULL;
    6. while (p != NULL)
    7. {
    8. q = p->next;
    9. delete p;
    10. p = q;
    11. }
    12. sq->length = 0;
    13. sq->head = NULL;
    14. sq->tail = NULL;
    15. return true;
    16. }

    获取队头元素

    1. bool GetHead(Queue* sq, DateElem* date)
    2. {
    3. if (!date || !sq || IsEmpty(sq) )return false;
    4. *date = sq->head->date; //指针返回队首元素
    5. return true;
    6. }

    主函数代码

    可以在主函数中测试一下刚刚实现的功能,还有一些功能可以自己去实现,比如获取队列长度。

    1. int main(void)
    2. {
    3. Queue* sq = new Queue ;
    4. DateElem* s = new DateElem;
    5. //1.初始化队列
    6. InitQueue(sq);
    7. for (int i = 1; i <= 7; i++)
    8. {
    9. if (EnterQueue(sq, &i))
    10. {
    11. cout << "入队成功" << endl;
    12. }
    13. else
    14. {
    15. cout << "入队失败," << i << "未插入" << endl;
    16. }
    17. }
    18. Print(sq);
    19. for (int i = 0; i < 8; i++)
    20. {
    21. if (PopQueue(sq, s))
    22. {
    23. cout << "出队的元素是" << *s << endl;
    24. }
    25. else
    26. {
    27. cout << "出队失败" << endl;
    28. }
    29. Print(sq);
    30. }
    31. ClearQueue(sq);
    32. Print(sq);
    33. return 0;
    34. }
  • 相关阅读:
    Echarts图表,防抖+自适应。
    计算机组成原理 期末复习笔记
    [附源码]JAVA毕业设计高校在线教师教学学术能力评价系统(系统+LW)
    Mysql进阶-视图篇
    基于开源IM即时通讯框架MobileIMSDK:RainbowChat v10.0版已发布
    基于php网上零食商店管理系统获取(php毕业设计)
    产品:我想要遮罩层下也能进行事件点击
    创建Scrapy项目
    java-php-python-ssm-校园网上跳蚤书市系统-计算机毕业设计
    【ROS入门】机器人系统仿真——相关组件以及URDF集成Rviz
  • 原文地址:https://blog.csdn.net/qq_66805048/article/details/133849228