队列的定义、基本操作、顺序实现(初始化,入队,出队)

简介: 数据结构:队列的定义、基本操作、顺序实现(初始化,入队,出队)附有代码讲解

1.队列的定义

队列(Queue):是只允许在一端进行插入,在另一端删除的线性表;

网络异常,图片无法展示
|

  • 入队就是插入操作
  • 出队就是删除操作

特点: 先进先出(FIFO)

重要术语:队头、队尾、空队列

  • 队头:允许删除的一端
  • 队尾:允许插入的一端
  • 空队列:没有任何数据元素

2.队列的基本操作

  • InitQueue(&Q):初始化队列,构造一个空队列Q
  • DestoryQueue(&Q):销毁队列,销毁并释放队列Q所占用的内存空间
  • EnQueue(&Q,x):入队,若队列Q未满,将x加入,使之成为新的队尾
  • DeQueue(&Q,&x):出队,若队列Q非空,删除队头元素,并用x返回
  • GetHead(Q,&x):读对头元素,若队列Q非空,则将队头元素赋值给x

3.队列的顺序实现

用静态数组存放队列元素,在定义一个队头指针,一个队尾指针

#define Maxsize 10
typedef struct{
    ElemType data[MaxSize];
    int front;
    int rear;
}SqQueue;

3.1初始化操作

初始化队列:

void InitQueue(SqQueue &Q){
    Q.rear=Q.front=0;    //初始队头、队尾指针指向0
}

判断队列是否为空:

bool QueueEmpty(SqQueue Q){
    Q.rear==Q.front
        return true
    return false;
}

3.2入队操作

入队操作只能从队尾入队;实现分析:需要先判断队列是否为满,然后将新元素插入队尾,然后修改队尾的指针后移。

bool EnQueue(SqQueue &Q,ElemType x){
    if(队列已经满)
        return false;
    Q.dara[Q.rear]=x;
    Q.rear=Q.rear+1;   
        return true;
}

3.2.1方案一(判空)

如果直接给队尾指针直接后移是会出问题的,当整个静态数组被存满的时候,rear指针就会指向MaxSize,如果依次让对头出队的时候,rear依然是指向MaxSize,所以rear==MaxSize的条件不能判断队列已经满了。所以需要修改为:让队尾指针+1后取模

Q.rear=(Q.rear+1)%MaxSize;

用模运算将储存空间在逻辑上变成了“环状”

网络异常,图片无法展示
|

3.2.2方案二(判空)

用size记录队列的当前长度,初始化size为0。

int size=0;  //初始化时候
size++;   //插入成功
size--;   //删除成功
队列空:size=0;
队列为满:size==MaxSize

3.2.3方案三(判空)

标记位,删除成功的时候tag=0,插入成功的时候tag=1

  • 队列满:front==rear && tag==1
  • 队列空:front==rear && tag==0

3.3出队操作

删除一个队列头元素,并且用x返回

bool DeQueue(SqQueue &Q,ElemType &X){
    if(Q.rear==Q.front)   //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    Q.front=(Q.front+!)%MaxSize;  //队列头指针后移
}

3.4 查队头元素

获得队列头元素值并用x返回

bool GetQueue(SqQueue Q,ElemType &X){
    if(Q.rear==Q.front)   //判断队列是否为空
        return false;
    x=Q.data[Q.front];
    return true;
}
目录
相关文章
|
11月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
935 9
|
存储
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
7913 1
【数据结构】连通图、连通分量与强连通图、强连通分量—区别在于强,强强在哪里?
|
7月前
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
546 9
|
11月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
749 8
|
11月前
|
网络协议 算法 网络性能优化
|
传感器 芯片
嵌入式通信协议全解析:SPI、I²C、UART详解(附带面试题)
通信是指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递。从广义上来说,通信是指需要信息的双方或多方在不违背各自意愿的情况下采用任意方法、任意媒质,将信息从某方准确安全地传送到另方。在出现电波传递通信后,通信被单一解释为信息的传递,是指由一地向另一地进行信息的传输与交换,其目的是传输消息。通信方式包括利用“电”来传递消息的电信,这种通信具有迅速、准确、可靠等特点,且几乎不受时间、地点、空间、距离的限制,因而得到了飞速发展和广泛应用。
4262 0
|
Ubuntu Linux 网络安全
Docker&Docker Compose安装(离线+在线)
Docker&Docker Compose安装(离线+在线)
14826 1
|
机器学习/深度学习 存储 缓存
数据结构从入门到精通——队列
队列是一种特殊的线性数据结构,遵循先入先出(FIFO)的原则。它只允许在队列的末尾添加元素(称为入队操作),并从队列的开头移除元素(称为出队操作)。队列在多种应用中发挥着重要作用,如计算机系统的任务调度、打印机作业管理以及多线程编程中的线程同步等。
258 0
|
Ubuntu 安全 网络协议