数据结构——队列及循环队列

说明:严蔚敏的《数据结构》(C语言版)学习笔记,记录一下,以备后面查看。

#include <stdio.h>
#include <stdlib.h>

#define OK 1;
#define ERROR -1;

typedef int QElemType;
typedef int Status;

//定义队列节点
typedef struct QNode{
    QElemType data;
    struct QNode *next;
}QNode, *QueuePtr;

//队列
typedef struct{
    QueuePtr front;  //队头指针
    QueuePtr rear;   //队尾指针
}LinkQueue;

//初始化队列
Status InitQueue(LinkQueue *q){
    q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
    if (!q->front) return ERROR;
    q->front->next = NULL;
    return OK;
}

//销毁队列
Status DestroyQueue(LinkQueue *q){
    while(q->front){
        q->rear = q->front->next;
        free(q->front);
        q->front = q->rear;
    }
    return OK;
}

//插入元素
Status EnQueue(LinkQueue *q, QElemType e){
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p) return ERROR;
    p->data = e;
    p->next = NULL;
    q->rear->next = p; //队列末尾指向p
    q->rear = p; //p记为尾指针
    return OK;
}

//出队列
Status DeQueue(LinkQueue *q, QElemType *e){
    if(q->front == q->rear) return ERROR;
    QueuePtr p = q->front->next; //指向队列头部第一个元素
    *e = p->data;
    q->front->next = p->next;
    if(q->rear == p) q->rear = q->front;
    free(p);
    return OK;
}

初始化的时候,让front和rear都等于0,此时队列元素个数是0,当入队4个元素后如下图

此时对队列元素的个数是 rear - front = 4, 假如队列变为下面的样子,rear < front

队列中空一格的原因是为了区别队列是“空”还是“满”,当队列尾指针的下一个位置是头指针则说明队列满了。

#include <stdio.h>
#include <stdlib.h>

#define OK 1
#define ERROR -1
#define MAXQSIZE 100 //最大队列长度

typedef int QElemType;
typedef int Status;

//循环队列
typedef struct{
    QElemType *base;
    int front;
    int rear;
}SqQueue;

//初始化循环队列
Status InitQueue(SqQueue *q){
    q->base = (QElemType *)malloc(MAXQSIZE * sizeof(QElemType));
    if (!q) return ERROR;
    q->front = q->rear = 0;
    return OK;
}

//获取队列长度
int QueueLength(SqQueue *q){
    return (q->rear - q->front + MAXQSIZE) % MAXQSIZE;
}

//入队
Status EnQueue(SqQueue *q, QElemType e){
    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){
    if(q->front == q->rear) return ERROR;
    *e = q->base[q->front];
    q->front = (q->front + 1) % MAXQSIZE;
    return OK;
}

时间: 2024-12-22 08:59:02

数据结构——队列及循环队列的相关文章

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

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

本文实现了顺序队列,与链队列不同的是,顺序队列需要考虑一个问题, 问题情况如下, 解决办法:循环队列,当rear到分配的数组空间末尾时,转到数组头 但是当q.rear==q.front时,又如何区分一种是空队列,一种是满队列的情况呢 这里有两种方案 本次代码实现了第一种方法,同时设置了一个技术变量length,稍加改动便可实现第二个方法 代码如下: #include<iostream>using namespace std;//该顺序队列为循环队列,解决队尾指针达到最大值,队列中有空闲单元,但

二、数据结构之栈、队列、循环队列

二.数据结构之栈.队列.循环队列 顺序栈 Stack.h 结构类型,函数声明: #ifndef _STACK_H_ #define _STACK_H_ typedef int SElementType; ///顺序栈 #define STACK_INIT_SIZE 20 #define STACK_INCREMENT 10 typedef struct { SElementType * base; SElementType * top; int stackSize;///当前栈的大小 }SqSt

数据结构与算法——循环队列

今天总结循环队列. 什么是队列? 队列跟栈差不多,也是一种操作受限的线性表,只允许在线性表的一端进行插入操作,在另一端进行删除操作.插入的一端称为队尾,删除的一端称为队头,插入操作称为入队,而删除操作称作出出队,不含任何数据元素的队称为空队.队列也有两种实现方式,一种就是顺序存储,用数组实现,另一种是采用链表形式.今天总结顺序存储的循环队列. 什么是循环队列? 循环队列就是,当队尾指针移动到数组末尾时,下次再有元素入队时,可以将队尾指针重新移到数组前面没有元素的位置. 为什么要使用循环队列? 循

c语言描述-链式队列与循环队列

我真的不喜欢写代码 队列的特点 先进先出,即只能从队尾插入元素,从队头删除元素 队列的链式存储结构 #include<stdio.h> #include <stdlib.h> #include<malloc.h> typedef struct QNode { int date; struct QNode *next; }QNode ,*QueuePtr; typedef struct { int size; //记录队列长度 QueuePtr front; //头指针

队列与循环队列

复习一下队列与循环队列的实现(C语言) 1.单链队列: 1 typedef struct QNode{ //若不写typedef,在C中每次定义QNode需要在前面加上struct,而C++不必 2 QElemType data; 3 struct QNode *next; 4 }QNode,*QueuePtr; 5 6 typedef struct{ //若不写结构体名,则需要加上typedef 7 QueuePtr front; 8 QueuePtr rear; 9 }LinkQueue;

数据结构学习之循环队列(顺序存储)

[摘要]队列特性:先进先出(FIFO)--先进队列的元素先出队列.来源于我们生活中的队列(先排队的先办完事). 这样有个缺陷,空间利用率不高,所以我们直接学习循环队列(基于连续内存的). (1)设计队列数据结构 typedef struct _QUEUE_NODE { int* pData; int length;//队列长度 int head ;//队头指针 int tail;//队尾指针 int count;//队列元素当前个数 }QUEUE_NODE; (2)申请队列内存 QUEUE_NO

数据结构-队列(2)-循环队列

循环队列 此前,我们提供了一种简单但低效的队列实现. 更有效的方法是使用循环队列. 具体来说,我们可以使用固定大小的数组和两个指针来指示起始位置和结束位置. 目的是重用我们之前提到的被浪费的存储. 设计循环队列 设计你的循环队列实现. 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环.它也被称为"环形缓冲器".循环队列的一个好处是我们可以利用这个队列之前用过的空间.在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即

数据结构基础(5)--队列和循环队列详解--静态方式

队列的具体应用: 所有和事件有关的操作都有队列的影子. (例如操作系统认为先进来的先处理) 定义: 一种可是实现"先进先出"的存储结构 分类: 链式队列:用链表实现 静态队列:用数组实现 静态队列通常都必须是循环队列,为了减少 内存浪费. 循环队列 : 1.静态队列为什么必须是循环队列 如果用传统意义的数组实现队列,无论入队还是出队,rear和front指针只能+不能-: 比 F元素下标小的的数组元素下标就浪费了. 循环队列怎么用呢? 当出现这种情况时,如果仍然需要插入元素,那么f指向