【自考】数据结构第三章,队列,期末不挂科指南,第4篇

队列

这篇博客主要介绍一下队列的概念,并且采用C语言,编写两种存储实现方式:顺序存储链式存储,当然还有常规的队列基本操作的实现算法

队列基本概念

标准解释:队列(Queue)是有限个同类型数据元素的线性序列,是一种先进先出(First In First Out FIFO)的线性表,新键入的数据元素插在队列尾端,出队列的数据元素在队列首部被删除。

教材中给了一个示意图,不错

顺序队列结构类型中有三个域:data、front、rear。

data:一维数组,存储队列中的数据元素
font:指向队列首元素的前一个单元
rear:指向实际的队列尾元素单元

参考示意图

入队列操作可以用两条赋值语句

SQ.rear = SQ.rear+1;
SQ.data[SQ.rear] = x;

出队列操作可以用一条语句完成

SQ.front = SQ.front+1

但是,会出现一些问题,通过示意图说明一下

当然还有一种情况,一边入队列,一边出队列
注意下图,SQ.front下面还有空间

所以为了解决这种假溢出问题,聪明的开发人员,想出来新的解决办法了,造一个环儿~

循环队列

下面看一个图,重点看一下SQ.rear与SQ.front的对应位置

如果上述图翻译成C语言代码,入队核心逻辑为

SQ.rear = (SQ.rear+1) % maxsize ;
SQ.data[SQ.rear] = x;

出队列的核心逻辑为

SQ.front = (SQ.front+1)%maxsize;

你在学习的时候,肯定对SQ.rear+1SQ.front+1有疑问

我们举例来说明一下吧

顺序队列的C语言实现

接下来难度指数上升,开始用C语言编写代码吧

一顿操作之后,还是比较简单的,总之不写链式存储,顺序的还是比较简单的

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

//循环队列最大数据元素个数
const int maxsize = 8; 

//循环队列的结构体
typedef struct cycqueue{
    int *data;
    int front,rear;
} CycQue;

//队列初始化
void init(CycQue *CQ){
    CQ->data = (int *)malloc(maxsize*sizeof(int));
    CQ->front = 0;
    CQ->rear = 0;
}

//判断队列是否为空
int empty(CycQue *CQ){
    if(CQ->rear==CQ->front) return 1;
    else return 0;
}

//入队列
int EnQueue(CycQue *CQ,int x){
    if((CQ->rear+1)%maxsize==CQ->front){
        printf("队列满");
        return 0;
    }
    else{
        CQ->rear =(CQ->rear+1) % maxsize;
        CQ->data[CQ->rear] = x;
        return 1;
    }

}

//出队列
int OutQueue(CycQue *CQ){
    if(empty(CQ)){
        printf("队列为空");
        return 0;
    }
    else{
        CQ->front = (CQ->front+1) % maxsize;
        return 1;

    }

}

int main()
{
    CycQue CQ;
    init(&CQ);

    EnQueue(&CQ,2);
    EnQueue(&CQ,4);
    printf("%d",CQ.rear);
    OutQueue(&CQ);
    printf("%d",CQ.front);
    return 0;
}

链式队列的C语言实现

链式队列其实有之前的经验之后,写起来难度系数也不会太高,接下来我们编写一个核心的部分代码

队列的链接实现实际上是用一个带有头结点的单链表来表示队列,成为链队列
头指针指向链表的头结点
单链表的头结点的next域指向队列首结点
尾指针指向队列尾结点,即单链表的最后一个结点

初始化

#include <stdio.h>
#include <stdlib.h>
typedef struct LinkQueueNode{
    int *data;
    struct LinkQueueNode *next;
} LkQueNode;

typedef struct LkQueue{
    LkQueNode *front,*rear;
} LkQue;

void init(LkQue *LQ){
    LkQueNode *temp;
    temp = (LkQueNode *)malloc(sizeof(LkQueNode)); //生成队列的头结点
    LQ->front = temp;    //队列头指针指向队列头结点
    LQ->rear = temp;     //队列尾指针指向队列尾结点
    (LQ->front)->next = NULL;

}

核心两个操作入队列出队列

入队列代码如下

//入队列
void EnQueue(LkQue *LQ,int x){

    LkQueNode *temp;
    temp = (LkQueNode *)malloc(sizeof(LkQueNode));
    temp->data = x;
    temp-next = NULL;
    (LQ->rear)->next = temp;
    LQ->rear = temp;
}

出队列这个事情就交给你自己吧,好好理解一下,就可以写出来了

自考要点

在考试中,队列容易出现编码题目,占比在7~10分,所以还是蛮重要的呢!

看到这里,辛苦啦,BYEBYE

原文地址:https://www.cnblogs.com/happymeng/p/shujujiegou_4.html

时间: 2024-10-13 16:51:21

【自考】数据结构第三章,队列,期末不挂科指南,第4篇的相关文章

【自考】数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇

学习目标 自考重点.期末考试必过指南,这篇文章让你理解什么是栈.什么是队列.什么是数组 掌握栈.队列的顺序存储结构和链式存储结构 掌握栈.队列的基本操作在顺序存储结构和链式存储结构上的实现 掌握矩阵的压缩存储 今天核心咱们先把栈搞清楚 栈和队列可以看做是特殊的线性表 .它们的特殊性表现在它们的基本运算是线性表运算的子集,它们是运算受限的线性表 栈 栈(Stack)是运算受限的线性表,这种线性表上的插入和删除操作限定在表的一端进行 基本概念 栈顶:允许插入和删除的一端 栈尾:另一端 空栈:不含任何

【自考】大学本科那个数据结构怎么学,期末不挂科指南,第1篇

数据结构那些事 如果你现在在上大学,恰好又是计算机相关专业 那么你肯定知道有一个非常枯燥的必修课<数据结构导论> 当然,你现在没上大学或者不是计算机专业,那你现在应该知道了,他们有个必修课叫<数据结构导论> 从今天开始梦想橡皮擦要写一套非常有趣的课程了 这套课程目的很简单 目的:如何通过数据结构期末考试,有趣! 适合人群: 大学计算机相关专业,有这门课程,然鹅你没学,或者因为一些莫名奇妙的原因,你旷课了 你想通过自考,注意自考,然后获取计算机的一个本科学历,这门课也是必修. 一门课

【自考】数据结构中的线性表,期末不挂科指南,第2篇

线性表 这篇博客写的是线性表相关的内容,包括如下部分,先看下有木有期待 啥是线性表 线性表的顺序存储 线性表的基本运算在顺序表上的实现 线性表的链式存储 线性表的基本运算在单链表上的实现 循环链表与双向循环链表 Over,内容还蛮多的!~  ̄□ ̄||,头大了... 首先明确一个非常重要的点 线性表是一个线性结构,注意上篇博客提过线性结构是数据的逻辑结构中的一种 基本概念 线性表是由n(n≥0)个数据元素组成的有穷序列 大白话:在内存上一个个排着,找到一个,剩下的挨着找就行 数据元素又称作结点 吐

【自考】数据结构第三章,数组,期末不挂科指南,第5篇

数组 概念如下 数组可以看成线性表的一种推广,其实就是一种线性表,一维数组又称为向量 数据由一组具有相同类型的数据元素组成,并存储在一组连续的存储单元中 若一维数组中的数据元素又是一维数组结构,则称为二维数组 依次类推,可以得到 三维数组和多维数组 数组基本运算 数组通常只有两种基本运算 读:给定一组下标,返回该位置的元素内容 写:给定一组下标,修改该位置的元素内容 数组的存储结构 一维数组元素的内存单元地址是连续的 二维数组可有两种存储方法:一种是以列序为主序的存储:另一种是以行序为主序的存储

【自考】数据结构第六章查找,期末不挂科指南,第10篇

查找的一些基本概念 查找表 是由同一类型的数据元素 构成的集合,它是一种以查找为"核心",同时包括其他运算的非常灵活的数据结构. 上面概念中的集合和数学上的定义是一致的,简单地说就是由任意一些可分辨的对象构成的整体 作为一个数学概念,集合的元素是没有任何限制. 作为一种数据结构,查找表的逻辑结构是集合,对查找表进行的操作包括 查找表中的某一元素,读取表中特定数据元素,插入和删除一个数据元素等. 若对查找表只进行前两项操作,则称此类查找表为 静态查找表. 若在查找过程中,向表中插入不存在

我理解的数据结构(三)—— 队列(Queue)

我理解的数据结构(三)-- 队列(Queue) 一.队列 队列是一种线性结构 相比数组,队列对应的操作是数组的子集 只能从一端(队尾)添加元素,只能从另一端(队首)取出元素 队列是一种先进先出的数据结构(FIFO) 二.数组队列与循环队列 1. 数组队列 如果你有看过我之前的文章不要小看了数组或者栈,你就会发现,自己封装一个数组队列是如此的轻松加愉快! (1)先定义一个接口,接口中定义队列需要实现的方法 public interface Queue<E> { int getSize(); bo

C语言数据结构——第三章 栈和队列

三.栈和队列 栈和队列是两种重要的线性结构.从数据结构的角度来看,栈和队列也是线性表,它的特殊性在于栈和队列的基本操作是线性表操作的子集,它们的操作相对于线性表来说是受到限制的,因此,可以称其为限定性的数据结构. 从数据类型的角度看,它们是和线性表大不相同的两种重要的抽象数据类型,在面向对象的程序设计中,它们是多型数据类型. 3.1-栈 3.1.1-抽象数据类型栈的定义 栈:是限定仅在表尾进行插入或删除操作的线性表,又可以称为后进先出的线性表. 栈顶:栈的表尾端 栈底:栈的表头端 空栈:不含元素

第三章 队列【数据结构】【链队列】

最近越来越感觉到c语言指针的强大~~ #include<stdio.h> #include<stdlib.h> #define QElemType int #define OK 1 #define ERROR 0 #define OVERFLOW 0 typedef int Status; //------------单链表------------队列的链式存储结构 typedef struct QNode { QElemType data; struct QNode *next;

数据结构——第三章树和二叉树:02二叉树

1.二叉树的存储结构: (1)二叉树的顺序存储表示: #define MAX_TREE_SIZE 100 //二叉树的最大结点数 typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; (2)二叉树的链式存储表示: ①二叉链表: typedef struct BiTNode //结点结构 { TElemType data; struct BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTre