首页 > 其他分享 >数据结构——顺序队列(循环)

数据结构——顺序队列(循环)

时间:2024-01-27 17:13:59浏览次数:18  
标签:顺序 return 队列 SqQueue EnQueue printf front 数据结构 rear

采用顺序表的方式实现循环队列。其中关键在于如何判断队列已满。通常情况下,当对头和队尾指向同一个节点时,可以判断为队空。但是,倘若队尾不断增加,最后队尾也会指向对头,此时队满和队空的判断条件一致。以下有三种对于对于队满判断的方法。
1、舍弃顺序表中的一个元素,也就是说,当队尾指向的是顺序表所剩下的最后一个没有存放元素的空间时,这时候就判断队列为满。这样做会牺牲一个空间,但是可以轻松判断队列是否已满。也是后续代码实现的方法。
2、增设size成员,当Q.sizeMaxsize时就可以判断队列为满,Q.size0时则队列为空
3、增设tag成员,记录是否成功进行删除和插入操作,假如成功进行删除操作则tag置为0,成功插入则置为1,当队头和队尾指向同一元素时,假如此时是队满,则之前一定进行了插入操作,即tag=1,队空时则之前一定进行了删除操作,即tag=0

完整代码

#include<bits\stdc++.h>
using namespace std;

#define Maxsize 6
#define ElementType int

typedef struct 
{
    ElementType data[Maxsize];
    int front,rear;
}SqQueue;

void InitQueue(SqQueue &Q){
    Q.front=Q.rear=0;
}

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

bool QueueFull(SqQueue &Q){
    if((Q.rear+1)%Maxsize==Q.front){
        return true;
    }
    else
        return false;
}

bool EnQueue(SqQueue &Q,ElementType x){
    if(QueueFull(Q)){
        printf("Queue is Full!\n");
        return false;
    }
    Q.data[Q.rear]=x;
    Q.rear=(Q.rear+1)%Maxsize;
    return true;
}

bool DeQueue(SqQueue &Q,ElementType &x){
    if(QueueEmpty(Q)){
        printf("Queue is Empty!\n");
        return false;
    }
    x=Q.data[Q.front];
    Q.front=(Q.front+1)%Maxsize;
    return true;
}

bool GetHead(SqQueue &Q,ElementType &x){
    if(QueueEmpty(Q)){
        printf("Queue is Empty!\n");
        return false;
    }
    x=Q.data[Q.front];
    return true;
}

bool print(SqQueue &Q){
    if(QueueEmpty(Q)){
        printf("Queue is Empty!\n");
        return false;
    }
    for(int i=Q.front;Q.rear!=i;){
        printf("%d ",Q.data[i]);
        i = (i+1)%Maxsize;
    }
    return true;
}

void test(){
    SqQueue Q;
    InitQueue(Q);
    EnQueue(Q,1);
    EnQueue(Q,2);
    EnQueue(Q,3);
    EnQueue(Q,4);
    EnQueue(Q,5);
    print(Q);
    EnQueue(Q,2);
    int x;
    GetHead(Q,x);
    printf("%d\n",x);
    DeQueue(Q,x);
    printf("%d\n",x);
    print(Q);
    
}

int main()
{
    test(); 
    return 0;
}

本文由博客一文多发平台 OpenWrite 发布!

标签:顺序,return,队列,SqQueue,EnQueue,printf,front,数据结构,rear
From: https://www.cnblogs.com/humanplug/p/17991664

相关文章

  • 单调队列
    单调队列其实是一个双端队列,可以从队首和队尾出队,但是只能在队尾入队。队列中的元素关系具有单调性。对于维护好的单调队列,队内元素是有序的,取出最大最小值的复杂度是\(O(1)\),每个元素各进队列一次,出队一次,因此复杂度是\(O(n)\)。单调队列是主要解决滑动窗口类问题的数据结构。......
  • priority_queue简介与用法(优先队列)
    priority_queue简介与用法 一、简介 1.概念priority_queue是C++标准库中的一个容器适配器(containeradapter),用于实现优先队列(priorityqueue)的数据结构。优先队列是一种特殊的队列,其中的元素按照一定的优先级进行排序,每次取出的元素都是优先级最高的。它的底层实现通常使......
  • 数据结构总结
    P4198楼房重建非常好题目,首先你显然能够得到一个楼房看得见的条件:当斜率严格大于之前的所有斜率时,这栋楼房可以被看见。接着我们考虑线段树\(sum_i\)维护\([l,r]\)从\(l\)出发可以看到的楼房数。我们发现重点在于push_up函数的实现,设左区间为\(ls\),右区间为\(rs\)。......
  • nodejs消费rabbitmq队列消息
    index.jsvaramqp=require('amqplib/callback_api');constMyConsume=require('./MyConsume');amqp.connect('amqp://name:password!@localhost:5672/vhost',function(error0,connection){if(error0){throwerror......
  • 29-数据结构介绍
          ......
  • 做题记录(数据结构+整体二分专题)
    情报传递对于每一个操作打上时间戳,对于\(T\)时刻的询问,即为询问路径上比\(T-c\)的值小的数有几个。直接树剖上维护权值树状数组即可。宝石给定一棵树,\(n\)个顶点,每个点有一个宝石,类型为\(W_i\),约定\(W_i\lem\)。你有一个收集器,可以收集至多\(c\)个宝石,并且收集......
  • 线性表 - 栈和队列
    栈后进先出LIFO两种实现方式使用数组实现的叫静态栈使用链表实现的叫动态栈相关题目简单难度225.用队列实现栈https://leetcode.cn/problems/implement-stack-using-queues/classMyStack{  privateQueue<Integer>q1;  privateQueue<Integer>q2; ......
  • 【数据结构】72变的双端队列
    双端队列前言大家好,很高兴又和大家见面啦!!!在前面的篇章中,咱们详细介绍了队列这种新的数据结构,现在我们简单的回顾一下队列的三要素——数据的逻辑结构、数据的存储结构以及数据的运算。数据的逻辑结构队列的数据元素在逻辑上是呈现线性结构,也就是说队列也是一种线性表,只不过是一种......
  • 进程间通信(队列和生产消费模型)
    (一)引入(1)什么是进程间的通信IPC进程间通信(Inter-ProcessCommunication,IPC)是指两个或多个进程之间进行信息交换的过程它是一种计算机编程技术,用于在不同的进程之间共享数据和资源(2)如何实现进程间通信借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取......
  • 数据结构与算法 pdf下载
    《数据结构与算法》涉及计算机中数据的组织、重组、移动、使用和提取等操作方法,及相关的数学分析。《数据结构与算法》所选的主题基于以下几个朴素的原则。第一,本书只讲解实用的技术,而忽略一些理论上非常虽然出色、但不太实用的算法。第二,本书既包含经典的方法,也包括最近发现的......