C利用语言实现数据结构之队列

目录
  • 一、链队列
  • 二、链队的表示
  • 三、链队的基本操作
    • 1. 链队的初始化
    • 2. 链队的销毁
    • 3. 入队
    • 4. 出队
  • 四、顺序队列
  • 五、循环队列
    • 1. 初始化
    • 2. 求队列长度
    • 3. 入队
    • 4. 出队

前言:

队列在生活中也比较常见,例如购物排队——新来的成员总是加入队尾,每次离开的成员总是队列头上的。

队列按存储方式可以分为两种:顺序队列和链队列。

一、链队列

链式队列中每个元素定义成一个结点,含数据域与指针域(指向下一结点),并设头尾指针。用图表示就是。

二、链队的表示

前面的链式结构,总是使用一个结点的结构来表示链表,但是在这里使用新的存储结构。定义一个结点结构,和一个队列结构。两个结构嵌套。

//定义节点结构
typedef struct QNode
{
    QElemType   data;   /*数据域*/
    struct QNode   * next;   /*指针域*/
 }QNode, *QueuePtr;
//定义队列结构
 typedef struct
 {
    QueuePtr front;
    QueuePtr rear;
 }LinkQueue;

三、链队的基本操作

1. 链队的初始化

Status initQueue(LinkQueue *Q)
{
    Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
    if(!Q.front) exit(OVERFLOW);
    Q.front->next = NULL;
    return OK;
}

2. 链队的销毁

Status destroyQueue(LinkQueue *Q)
{
    while (Q.front)
    {
        Q.rear = Q.front->next;
        free(Q.front);
        Q.front = Q.rear;
    }
   return OK;
}

3. 入队

Status enQueue(LinkQueue *Q, QElemType e)
{
    QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
    if(!p) exit(OVERFLOW);
    //插入数据
    p->data = e;
    p->next = NULL;
    //Q.rear一直指向队尾
    Q.rear->next = p;
    Q.rear = p;
    return OK;
 }

4. 出队

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;   //队头元素p出队
    if(Q.rear == p)   //如果队中只有一个元素p, 则p出队后成为空队
    Q.rear = Q.front;     //给队尾指针赋值
    free(p);   //释放存储空间
    return OK;
}

四、顺序队列

用一组连续的存储单元依次存放队列的元素,并设两个指针frontrear分别指示队头和队尾元素的位置。
front:指向实际的队头;rear:指向实际队尾的下一位置。
初态front=rear=0;队空:front=rear;队满:rear=M;
入队q[rear]=x; rear= rear+1; 出队:x=q[front];front=front+1;

顺序队列的表示:

#define MAXQSIZE  100
typedef struct
{
    QElemType *base;
    int  front;   //头指针指示器
    int  rear;  //尾指针指示器
} SqQueue;

存在的问题:

随着入队、出队操作的进行,整个队列会整体向后移动,这样就出现了下图的现象:队尾指针虽然已经移到了最后,而队列却未真满的“假溢出”现象,使得队列的空间没有得到有效的利用

那我们该如何解决假溢出的问题呢?

有以下两种方法:

  • 将队中元素向队头移动:当移动数据较多时将会影响队列的操作速度。
  • 采用循环队列:Q[0]接在Q[MAXQSIZE-1]之后,一个更有效的方法是将队列的数据区Q[0 .. MAXQSIZE-1]看成是首尾相连的环,即将表示队首的元素Q[0]与表示队尾的元素Q[MAXQSIZE–1]连接起来,形成一个环形表,这就成了循环队列。当Q.rear=MAXQSIZE-1时再入队,令Q.rear=0, 则可以利用已被删除的元素空间。如下图。

五、循环队列

在循环队列中,不可以根据等式front == rear可以判别队满和队空。因为此时条件是相同的,解决这种问题的方法一般有两种。

少用(损失)一个空间,以尾指针加1等于头指针作为队满的标志。因此:当front==rear,表示循环队列为空;当front ==(rear+1)% MAXLEN,表示循环队列为满。
在定义结构体时,附设一个存储循环队列中元素个数的变量n,当n==0时表示队空;当n==MAXLEN时为队满。

循环队列的基本操作:

1. 初始化

Status initQueue (SqQueue *Q)
{
    Q.base=(QElemType *) malloc(MAXQSIZE * sizeof(QElemType));
    if (!Q.base) exit(OVERFLOW);
    Q.front = Q.rear = 0;
    return OK;
}

2. 求队列长度

int queueLength(SqQueue *Q)
{
    return (Q.rear - Q.front+MAXQSIZE) % MAXQSIZE;
}

3. 入队

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;
}

4. 出队

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;
}

到此这篇关于C利用语言实现数据结构之队列的文章就介绍到这了,更多相关C语言实现数据结构 队列内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言编程数据结构的栈和队列

    目录 栈 数组实现 标题全部代码 Stack_array.c Stack_array.h 初始化数组栈 满栈后扩容 是否为空栈 压栈和退栈 链表实现 stack_chain.h stack_chain.c 整个压栈流程 整个弹栈流程 出栈情况 队列 队列的实现 queue_chain.h queue_chain.c 一个结构体类型用于维护这个队列 概念流程图 入队列的实现 出队列的实现 是否空队 栈 栈是一种以后进先出为顺序对对象进行添加或删除的数据结构 对栈进行形象记忆就像是桌子上的一堆书或一

  • 详解数据结构C语言实现之循环队列

    本文讲的是循环队列,首先我们必须明白下面几个问题 循环队列的基础知识 1.循环队列需要几个参数来确定 循环队列需要2个参数,front和rear 2.循环队列各个参数的含义 (1)队列初始化时,front和rear值都为零: (2)当队列不为空时,front指向队列的第一个元素,rear指向队列最后一个元素的下一个位置: (3)当队列为空时,front与rear的值相等,但不一定为零: 3.循环队列入队的伪算法 (1)把值存在rear所在的位置: (2)rear=(rear+1)%maxsize

  • C语言数据结构链表队列的实现

    C语言数据结构链表队列的实现 1.写在前面 队列是一种和栈相反的,遵循先进先出原则的线性表. 本代码是严蔚敏教授的数据结构书上面的伪代码的C语言实现代码. 分解代码没有包含在内的代码如下: #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 typedef int QElemtype; typedef int status; 2.代码分解 2.1对队列和节点的结构定义 typedef struct

  • C利用语言实现数据结构之队列

    目录 一.链队列 二.链队的表示 三.链队的基本操作 1. 链队的初始化 2. 链队的销毁 3. 入队 4. 出队 四.顺序队列 五.循环队列 1. 初始化 2. 求队列长度 3. 入队 4. 出队 前言: 队列在生活中也比较常见,例如购物排队--新来的成员总是加入队尾,每次离开的成员总是队列头上的. 队列按存储方式可以分为两种:顺序队列和链队列. 一.链队列 链式队列中每个元素定义成一个结点,含数据域与指针域(指向下一结点),并设头尾指针.用图表示就是. 二.链队的表示 前面的链式结构,总是使

  • C语言数据结构系列队列篇

    目录 一.队列(Queue) 0x00队列的概念 0x01队列的结构 二.队列的定义 0x00链式队列 0x02 接口函数 三.队列的实现 0x00队列初始化(QueueInit) 0x01销毁队列(QueueDestroy) 0x02判断队列是否为空(HeapIsEmpty) 0x03入队(QueuePush) 0x04出队(QueuePop) 0x05 返回队头数据(QueueFront) 0x06 返回队尾数据(QueueBack) 0x07 求队列大小(QueueSize) 0x08完整

  • C语言数据结构之队列的定义与实现

    目录 一.队列的性质 二.队列的结构 三.代码实现 头文件 功能函数 一.队列的性质 上次我们学习栈,了解到栈储存释放数据的方式是:先进后出 而队列与其相反,队列是:先进先出,后进后出. 二.队列的结构 多个链表节点 + 头尾指针   (链表式队列) 链表节点负责存储数据:头节点 负责定位先进的起始数据,方便先出: 尾节点负责记录尾部数据,方便确定队列当前状态. 三.代码实现 头文件 这里方便统一调用,将头尾指针定义成一个结构体 . #include<stdio.h> #include<

  • 深入浅析C语言中堆栈和队列

    1.堆和栈 (1)数据结构的堆和栈 堆栈是两种数据结构. 栈(栈像装数据的桶或箱子):是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同要取出放在箱子里面底下的东西(放入的比较早的物体),首先要移开压在它上面的物体(放入的比较晚的物体). 堆(堆像一棵倒过来的树):是一种经过排序的树形数据结构,每个结点都有一个值.通常所说的堆的数据结构,是指二叉堆.堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆.由于堆的这个特性,常用来实现优先队列,堆的存取是随意,

  • JS中的算法与数据结构之队列(Queue)实例详解

    本文实例讲述了JS中的算法与数据结构之队列(Queue).分享给大家供大家参考,具体如下: 队列(Queue) 我们之前说到了栈,它是一种比较高效的数据结构,遵循 先入后出(LIFO,last-in-first-out) 的原则.而今天我们要讨论的队列,它也是一种特殊的列表,它与栈不同的是, 队列只能在队尾插入元素,在队首删除元素,就像我们平时排队买票一样~ 队列用于存储按顺序排列的数据,遵循 先进先出(FIFO,First-In-First-Out) 的原则,也是计算机常用的一种数据结构,别用

  • Go语言实现栈与队列基本操作学家

    目录 一.前言 二.实现栈与队列基本操作 2.1 栈基本操作 2.2 队列基本操作 三.用栈实现队列 3.1 理论 3.2 算法题 3.3 思路 3.4 代码部分 四.用队列实现栈 4.1 理论 4.2 算法题 4.3 思路 4.4 使用两个队列实现 4.5 优化 4.6 使用一个队列实现 一.前言 go语言中,并没有栈与队列相关的数据结构,但是我们可以借助切片来实现栈与队列的操作:接下来我们一起实现栈与队列基本操作,并且还会实现用栈实现队列,用队列实现栈的操作. 二.实现栈与队列基本操作 2.

  • NDK 数据结构之队列与栈等的实现

    NDK 数据结构之队列与栈等的实现 com_tz_ndk_cpp_NDKCpp.h /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_tz_ndk_cpp_NDKCpp */ #ifndef _Included_com_tz_ndk_cpp_NDKCpp #define _Included_com_tz_ndk_cpp_NDKCpp #ifdef __cp

  • Java数据结构之队列(动力节点Java学院整理)

    队列的定义: 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表. (1)允许删除的一端称为队头(Front). (2)允许插入的一端称为队尾(Rear). (3)当队列中没有元素时称为空队列. (4)队列亦称作先进先出(First In First Out)的线性表,简称为FIFO表. 队列的修改是依先进先出的原则进行的.新来的成员总是加入队尾,每次离开的成员总是队列头上的(不允许中途离队). 队列的存储结构及实现 队列的顺序存储结构 (1) 顺序队列的定义: 队列

随机推荐