首页 > 其他分享 >队列以及循环队列及其基本操作

队列以及循环队列及其基本操作

时间:2024-10-22 19:45:25浏览次数:9  
标签:Status return 队列 next 循环 front 基本操作 rear

和栈相反,队列是一种先进先出的数据结构,他在表尾插入元素,表头删除元素。队列也分为链队列以及顺序队列两种,链队列动态分配空间,不用担心空间不足,顺序队列简单易懂,操作方便,但是空间利用率低,所以我们一般使用链式队列结构。

  • 链式队列

对顺序队列进行初始化,顺序队列分配空间类似于数组

typedef char QElemType
typedef int Status;

typedef struct QNode{  //创建链队列
    QElemType data;    //存储队列数据
    QNode *next;       //存储下一个结点指针
}QNode,QPtr*;

typedef struct{
    QNode *front;      //首结点指针
    QNode *rear;       //尾结点指针
}LinkQueue;
Status InitQueue(LinkQueue &q){
    s.front=(SElemType *)malloc(INIT_STACK_SIZE*sizeof(SElemType)); //为尾结点分配空间
    if(!s.front)exit(OVERFLOW);
    s.front=s.rear;
    return OK;
}

获取队列头部数据

Status GetTop(SqStack q,ElemType &e){
    if(s.front==s.rear)return ERROR;
    e=s.front->next.data
    return OK;
}

在队尾插入元素

Status Enqueue(LinkQueue &q,QElemType e){
    QPtr q=(QPtr)malloc(sizeof(QNode));
    if(!q)exit(OVERFLOW);
    q->data=e;
    q->next=NULL;
    Q.rear->next=q;
    Q.rear=q;
}
    

在队首删除元素

Status Dequeue(LinkQueue &q,QElemType &e){
    if(q.front==q.rear)return ERROR;
    QNode *temp;
    temp=q.front->next;    
    e=temp->data;
    q.front->next=temp->next;
    if(q.rear==temp)    //如果队首元素下一个元素是尾结点,则删除后队列为空队列
        q.rear=q.front;
    free(temp);
    return OK;
}

计算队列元素个数

Status QueLength(LinkQueue &q){
    QNode p=q.front->next;    //建立p指针从首元素结点向后遍历并且计数
    int len=0;
    while(p!=NULL){            //p指针不指向空时向后遍历
        len++;
        p=p->next;
    }
    return len;
}

  • 循环队列

循环队列与普通队列的区别在于循环队列首尾相接,其首尾相接的特性可以使得他大大减少了空间的浪费,队列存储到末端时,由于其首尾相接的特性,可以在队首前面未存储数据的空间存储。

循环队列用类似线性表存储,需要预先分配循环队列存储空间,值得注意的点时循环队列由于队列可能存储在超出队列长度的位置,所以在Q.rear+1时需要对maxsize取模,得到实际的存储位置

//–––––循环队列──队列的顺序存储结构–––––
#define MAXQSIZE   100                 //最大队列长度
typedef  struct
{
QElemType *    base;        //初始化的动态分配存储空间
    int front;                //头指针,若队列不空,指向队列头元素
    int rear;   //尾指针,若队列不空,指向队列尾元素的下一个位置
}SqQueue;
Status InitQueue(SqQueue &Q)
{//  构造一个空队列Q
    Q.base =(QElemType*)malloc(MAXQSIZE*sizeof(QElemType));
    if (!Q.base)  exit(OVERFLOW);  //存储分配失败
    Q.front =0;
    Q.rear =Q.front;
    return OK;
}

 返回队列长度

int QueueLength(SqQueue Q)
{//返回Q的元素个数,即队列的长度
  return(Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;
}

  • 插入数据

在队尾即Q.rear的位置存入新的数据e,Q. rear后移。

Status EnQueue(SqQueue &Q,QElemType e)
{// 插入元素e为Q的新的队尾元素
   if((Q.rear+1)%MAXQSIZE==Q.front)   //队列满
        return ERROR;                                      
   Q.base[Q.rear]=e;
   Q.rear=(Q.rear+1)%MAXQSIZE;
   return OK;
}
  • 删除数据
Status DeQueue(SqQueue &Q, QElemType &e)
{// 删除队头元素,送给变量e
    if(Q.rear==Q.front) return ERROR;   //队列空
    e= Q.base[Q.front];
    Q.front=(Q.front+1)%MAXQSIZE; //队头指针后移,队首元素出队
    return OK;
}
  • 检验是否队列为空 
Status QueueEmpty(SqQueue Q)
{ 
    if( Q.rear==Q.front) return TRUE;
    return FALSE;
}

标签:Status,return,队列,next,循环,front,基本操作,rear
From: https://blog.csdn.net/xiaoyan4869/article/details/142829449

相关文章

  • 循环结构程序设计之习题
    输入两个正整数m和n,求其最大公约数和最小公倍数//输入两个正整数m和n,求其最大公约数和最小公倍数#include<stdio.h>intmain(void){ intm,n,iMax,iMin,iGcd; scanf("%d%d",&m,&n); if(m>n) { iMax=m; iMin=n; } else { iMax=n; ......
  • 232. 用栈实现队列
    classMyQueue{public:MyQueue(){}voidpush(intx){s1.push(x);}intpop(){intret;if(!empty()){if(!s2.empty()){ret=s2.top();s2.pop();......
  • 一文搞定栈与队列
    栈与队列基础入门栈常用操作栈的实现基于链表实现基于数组实现 队列常用操作队列的实现基于链表实现基于数组实现 双向队列常用操作重点知识栈与队列的区别怎么用两个队列去实现栈 两个栈实现一个队列相关题解leetcode20.有效的括号法一:栈leetcode155.......
  • 第3讲:分支和循环(上)
    文章目录第3讲:分支和循环(上)1.if语句1.1if1.2else1.3分支中可以包含多条语句1.4嵌套if1.5悬空else问题2.关系操作符3.条件操作符4.逻辑操作符:&&,||,!4.1逻辑取反运算符!4.2逻辑与运算符4.3逻辑或运算符4.4练习:闰年的判断4.5短路5.switch语句5.1if......
  • 蓝桥杯基本操作和运算
    文章目录1.基本运算2.循环--进制转换/最大公约数2.1进制转换2.2求解最大公约数3.数组与字符串4.常用的API5.快速读写模版蓝桥杯基本操作和运算10-22号正式开始准备蓝桥杯的比赛,准备参加这个大学B组的Java的赛项1.基本运算首先就是基本的输入输出:system.out.pr......
  • 多线程(八):阻塞队列 & 生产者消费者模型
    目录1.阻塞队列 2.生产者消费者模型2.1场景举例2.2重要优势2.2.1解耦合 2.2.2削峰填谷2.3付出的代价3.BlockingQueue4.模拟实现阻塞队列4.1wait的注意事项4.2代码实现 1.阻塞队列在数据结构中,我们学习了简单的普通队列,也学习了较为复杂一些......
  • C语言第三学:分支和循环
       C语⾔是结构化的程序设计语⾔,这⾥的结构指的是顺序结构、选择结构、循环结构,C语⾔是能够实现这三种结构的,其实我们如果仔细分析,我们⽇常所⻅的事情都可以拆分为这三种结构或者这三种结构的组合。我们可以使⽤if、switch实现分⽀结构,使⽤for、while、dowhi......
  • 优先级队列(priority_queue)
     priority_queue简介   优先级队列的底层结构其实就是堆,就是我们在学习二叉树的时候学习的堆。它是一种逻辑结构,底层还是vector,我们把它想象成一个堆结构。    我们在学习堆的时候,知道了它的父亲和左右孩子的关系。它如果存在孩子,则一定存在这一种关系,leftchi......
  • 分支与循环:猜数字游戏的代码实现
    在我们学习分支和循环之后我们可以简单的写一个小游戏了——猜数字思维构想    一、预期效果         实现随机生成0~100之间的数字,玩家进行猜测,按结果进行判断。对于结果实现如果玩家猜大了给予玩家“猜大了”的提示;如果猜小了,给予玩家“猜小了”的提示;若......
  • 四,增强for循环
    增强for循环:简化数组和集合遍历的详细指南在Java编程中,遍历数组和集合是一个基本且频繁的操作。传统的for循环虽然可以实现这一功能,但它的语法较为繁琐,尤其是在需要遍历集合中的每个元素时。为了简化这一过程,Java引入了增强for循环(也称为for-each循环),它提供了一种更加简洁和易读......