队列(FIFO)—循环队列、队列的链式存储

1 队列的定义

队列是只允许在一端(队尾)进行插入操作,而在另一端(队头)进行删除操作的线性表。

2 队列的特点

1)先进先出是队列最大的特点,是应用中非常常见的模型,例如排队;

2)队列也属于线性表,线性表的特性队列都拥有。

3 循环队列的实现及关键点

3.1 关键点

1)队列为空的条件:队头指针等于队尾指针,即head == tial;

2)队列中保留一个元素空间,当队列满时,尾指针和头指针之间还剩一个元素空间。队列为满的条件:(tial + 1) % quenceSize == head;

3)队列中元素个数为:(tial + quenceSize - head) % quenceSize。

3.2 实现

 1 #ifndef CYCLESQUENCE_H
 2 #define CYCLESQUENCE_H
 3
 4 typedef int ElemType;
 5
 6 class CycleQuence {
 7 private:
 8     ElemType* m_pData;    //数组地址
 9     int m_nHead;    //首元素位置
10     int m_nTial;    //尾元素位置
11     int m_nMaxSize;    //数组长度
12
13 public:
14     CycleQuence(int maxSize);
15     ~CycleQuence();
16     void ClearQuence() { m_nHead = 0, m_nTial = 0; }    //清空队列
17     bool EnterQuence(ElemType elem);    //入队
18     bool DeleteQuence(ElemType* pElem);    //出队
19     void VisitQuence() const;    //查看队列元素
20     bool IsEmpty() const { return m_nHead == m_nTial; }    //判断是否为空
21     bool IsFull() const { return m_nHead == (m_nTial + 1) % m_nMaxSize; }    //判断是否为满
22 };
23
24 #endif
 1 #include "pch.h"
 2 #include "CycleSquence.h"
 3 #include <iostream>
 4
 5 CycleQuence::CycleQuence(int maxSize)
 6 {
 7     m_nHead = 0;
 8     m_nTial = 0;
 9     m_nMaxSize = maxSize;
10     m_pData = new ElemType[maxSize];
11 }
12
13 CycleQuence::~CycleQuence()
14 {
15     delete[] m_pData;
16 }
17
18 bool CycleQuence::EnterQuence(ElemType elem)    //入队
19 {
20     if (IsFull())    //队满
21     {
22         std::cout << "The quence is full." << std::endl;
23         return false;
24     }
25
26     m_pData[m_nTial] = elem;
27     m_nTial = (m_nTial + 1) % m_nMaxSize;
28     VisitQuence();
29
30     return true;
31 }
32
33 bool CycleQuence::DeleteQuence(ElemType* pElem)    //出队
34 {
35     if (IsEmpty())    //队空
36         return false;
37
38     *pElem = m_pData[m_nHead];
39     m_nHead = (m_nHead + 1) % m_nMaxSize;
40     VisitQuence();
41
42     return true;
43 }
44
45 void CycleQuence::VisitQuence() const    //查看队列元素
46 {
47     std::cout << "The element of quence: ";
48     for (int i = m_nHead, j = 0; j < (m_nTial + m_nMaxSize - m_nHead) % m_nMaxSize; i = (i + 1) % m_nMaxSize, ++j)
49         std::cout << m_pData[i] << ‘ ‘;
50     std::cout << std::endl;
51 }

测试代码(Visual Studio 2017上测试):

 1 #include "pch.h"
 2 #include "CycleSquence.h"
 3 #include <iostream>
 4
 5 int main()
 6 {
 7     CycleQuence quence(5);
 8     quence.EnterQuence(1);
 9     quence.EnterQuence(2);
10     quence.EnterQuence(3);
11     quence.EnterQuence(4);
12     ElemType elem;
13     quence.DeleteQuence(&elem);
14     quence.DeleteQuence(&elem);
15     quence.DeleteQuence(&elem);
16     quence.EnterQuence(5);
17     quence.EnterQuence(6);
18     quence.EnterQuence(7);
19     quence.EnterQuence(8);
20
21     return 0;
22 }

测试结果:

在写VisitQuence()这个方法时,想了好一会儿,就是想可不可以用一个变量遍历队列。但是其实没必要这样,代码在执行效率差不多的情况下,更要注重清晰易懂,简洁的代码有时更容易让人费解。

4 队列的链式存储的实现和关键点

4.1 关键点

1)链队列为空的条件为:head == tial;

2)队列的链式存储通过单链表实现,尤其注意入队、出队操作。

4.2 实现

略。

该篇博客是自己的学习博客,水平有限,如果有哪里理解不对的地方,希望大家可以指正!

原文地址:https://www.cnblogs.com/zpchya/p/10723559.html

时间: 2024-10-12 12:29:54

队列(FIFO)—循环队列、队列的链式存储的相关文章

3-7-队列的链式存储-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 队列的链式存储 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h        相关测试数据下载  链接? 无数据    

顺序循环队列和链式存储队列(带头结点和不带头结点)

1.顺序存储的循环队列 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <stdbool.h> 4 5 typedef int ElementType; 6 typedef int Position; 7 typedef struct QNode* PtrToNode; 8 struct QNode { 9 ElementType *Data; 10 Position Front, Rear; 11 int M

队列的顺序存储结构和链式存储结构

队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表(在队尾进行插入操作,在对头进行删除操作). 与栈相反,队列是一种先进先出(First In First Out, FIFO)的线性表. 与栈相同的是,队列也是一种重要的线性结构,实现一个队列同样需要顺序表或链表作为基础. 队列的链式存储结构 队列既可以用链表实现,也可以用顺序表实现.跟栈相反的是,栈一般我们用顺序表来实现,而队列我们常用链表来实现,简称为链队列. typedef struct QNode { ElemT

数据结构:队列的链式存储结构

链队列的实现方法: 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头节点,而队尾指针指向终端节点.空队列时,front和rear都指向头节点. 注意:这里的实现是有头结点的,在队列的初始化函数中要为头结点开辟空间. 链队列的实现代码: #include <iostream> #include <stdlib.h> using namespace std; /**********************

队列的定义与操作——顺序存储和链式存储

队列的 存储结构 有 顺序存储 和 链式存储. 1. 队列的顺序存储与操作 (循环队列) 1 typedef int Position; 2 struct QNode { 3 ElementType *Data; // 存储元素的数组 4 Position Front, Rear; // 队列的 头.尾指针 5 int Cap; // 队列最大大容量 6 }; 7 typedef struct QNode *Queue; 8 9 // 操作集 10 Queue CreateQueue(int M

队列的链式存储结构及实现

ref : https://blog.csdn.net/qq_29542611/article/details/78907339 队列的链式存储结构,其实就是线性表的单链表,只不过它只是尾进头出而已,我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端节点.如果 空队列时,front和rear都指向头结点. 入队操作: 在队尾添加元素,先将队尾元素的next指向添加的元素,然后将队尾指针重新指向新的队尾即可. 出队操作: 头结结点指向的结点即为队头结点,出

队列的链式存储结构(C语言实现)

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define OK 1 5 #define ERR 2 6 #define TRUE 1 7 #define FALSE 0 8 9 typedef int status; //定义函数返回的状态,OK & ERR 10 typedef char datatype; //定义队列中每个元素的数据类型,这里暂定为字符型 11 12 typedef struct LinkQueue_

[转载]队列的链式存储

申明:转自    http://www.cnblogs.com/Romi/archive/2012/08/28/2660954.html 1 //队列的链式存储.C 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<malloc.h> 5 6 //定义队列 7 typedef struct node { 8 int data; 9 struct node *next; 10 }Queue; 11 12 //定义对手指

队列的链式存储---链表实现

/* 队列的链式存储 */ /* with no header */ struct Node; struct LinkQueue; typedef struct Node *PtrToNode; typedef struct LinkQueue *PtrTorf; struct Node{ ElementType X; PtrToNode Next; }; struct LinkQueue{ PtrToNode rear; PtrToNode front; }; int IsEmpty(PtrT