数据结构之第三章之队列

1~~队列的特点:队列是限定仅在表尾进行插入和表头进行删除操作的线性表,是先进先出的线性表。

1~~循环队列

(1)循环队列的循环表示

typedef struct {
        int *base;//初始化的动态分配存储空间
        int front;//头指针,若队列不为空,指向队列头元素
        int rear;//尾指针,若队列不空,指向队列尾元素的下一个位置
}QUEUE;

若队列不空,尾指针始终指向队列尾元素的下一个位置,也即尾指针始终是"空闲的“,可以起到分隔作用。

2~~~入队

int enqueue(QUEUE head,int e){        //插入元素e为head的新的队尾元素        if((head.rear+1)%MAXQSIZE==head.front)        return 0;//队列满        head.base[head.rear]=e;        head.rear=(head+1)%MAXQSIZE;        return 1;}

3~~~出队

int deletequeue(QUEUE head,int e){
        //若队列不空,则删除队列head的队头元素,则用e返回
        if(head.front==head.rear)
            return 0;
        e=head.base[head.front];
        head.front=(head.front+1)%MAXQSIZE;
        return 1;
}

4~~~判队空

bool queueempty(QUEUE head){
//若队列不空,返回false,否则,返回true
if(head.rear==(head.front+1)%MAXQSIZE)
    return true;
else
    return false;
}

5~~~判队满

bool isfullqueue(QUEUE head){
    //若队列为满,则返回true,否则返回false;
    if(head.front==((head.rear+1)%MAXQSIZE))
        return true;
    else
        return false;

}

2链式队列

(1)链式队列的存储表示

typedef struct Qnode{
        int data;
        struct Qnode *next;
}NODE,*QNODE;
typedef struct{
    QNODE front;//对头指针
    QNODE rear;//队尾指针
}LINKQUEUE;

链队列包含头指针和尾指针和头节点,当头指针和尾指针相等时,判定链队列为空;

删除队列头元素时,一般情况下,仅需修改头节点的指针,但当队列中只有最后一个元素被删除后,队列尾指针也将丢失,因此需对队列尾指针重新赋值,而元素入队时,只需修改尾指针。

(2)  入队(Enqueue)

int Enqueue(LINKQUEUE Q,int e){
        //插入元素为e为Q的新的队尾元素
        newbase=(QNODE)malloc(sizeof(NODE));
        if(!newbase)
            exit(-1);
        newbase->data=e;
        newbase->next=NULL;
        Q.rear->next=newbase;
        Q.rear=newbase;
        return 1;

}

(3)出队

int deletequeue(LINKQUEUE Q,int e){
        //若队列不空,则删除Q的队头元素,用e返回其值
        if(Q.front==Q.rear)
            return 0;
        newbase=Q.front->next;
        e=newbase->data;
        Q.front->next=newbase->next;
        if(Q.rear==newbase)
            Q.rear=Q.front;
        free(newbase);
        return 1;

}

(4)判队列

bool queueempty(LINKQUEUE Q)
{
    //若队列空,返回true,否则返回false
     if(Q.front==Q.rear)
         return true;
     else
         return false;
}
时间: 2024-10-25 19:23:07

数据结构之第三章之队列的相关文章

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

队列 这篇博客主要介绍一下队列的概念,并且采用C语言,编写两种存储实现方式:顺序存储和链式存储,当然还有常规的队列基本操作的实现算法 队列基本概念 标准解释:队列(Queue)是有限个同类型数据元素的线性序列,是一种先进先出(First In First Out FIFO)的线性表,新键入的数据元素插在队列尾端,出队列的数据元素在队列首部被删除. 教材中给了一个示意图,不错 顺序队列结构类型中有三个域:data.front.rear. data:一维数组,存储队列中的数据元素 font:指向队列

数据结构复习【第三章】 队列

(1)掌握队列的相关概念.特点和基本操作(入队.出队.判队空等). 队列:只允许在表的一端进行插入,而在另一端删除元素的线性表. 特点:先进先出 (FIFO) 基本操作: (2)掌握队列的顺序存储和链式存储的实现. 图解: 顺序存储: 入队: { if ( ( rear+1)%queuesize = = front ) throw "上溢,无法入队": base[rear] = x: rear = (rear+1)%queuesize: } 出队: { if (front = = re

浙大《数据结构》第三章:树(上)

注:本文使用的网课资源为中国大学MOOC https://www.icourse163.org/course/ZJU-93001 查找 查找:根据某个给定的关键字K,从集合R中找出关键字与K相同的记录. 静态查找:集合中的记录是固定的,没有插入删除的操作,只有查找: 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除. 静态查找 方法1:顺序查找 int SequentialSearch( StaticTable *Tbl, ElementType K) { //在表Tbl[1]~T

数据结构之第三章之栈

栈和队列其实就是操作受限的队列. 1--栈的特点:栈是限定仅在表的另一端(栈顶)进行插入,删除操作的线性表,是后进先出的线性表. 2--顺序栈 (1)顺序栈的存储表示 typedef struct Node{ struct Node *base;//栈底指针,在栈构造之前和销毁之后,base的值为NULL struct Node *top;//这个是栈定指针,用以压栈的位置. int size;//当前已分配的存储单元数,以元素为单位 }NODE,*PNODE; (2) 压栈操作 int pus

数据结构期末复习第三章栈和队列

第三章:栈和队列 栈的特性:后进先出(LIFO) 1.  输入序列为ABC,可以变为CBA时,经过的栈操作为( B )A. push, pop, push, pop, push, popB. push, push, push, pop, pop, popC. push, push, pop, pop, push, popD. push, pop, push, push, pop, pop 解析: ABC经过push,push,push操作后,从栈顶到栈底元素为CBA,经过pop,pop,pop出

第三章小结--栈与队列

第三章小结 第三章我们主要学习了栈和队列.经过第一次的写博客,与课后的学习与借鉴.我看到很多其他的同学在整理知识的时候采用了画大纲图,架构图的方法.不得不说,那样子确实比纯粹的文字更加简单明了.于是我决定也学习和效仿一下. 以下便是图解: 通过大图来看,很明显,和前面学习的顺序表,链表栈和队列的操作有同工异曲之妙.实际上围绕着栈和队列的也是分为两大分支,顺序表和链表.操作也是从初始化,插入,删除,查找几个操作入手. 当然,也有不同的地方,栈是典型的先进而后出,队列则是先进先出,其插入和删除的操作

【知识强化】第三章 栈和队列 3.1 栈

在第三章我们将继续学习三种非常重要的线性结构,分别是栈和队列的这样的受限线性表.我们将从它们的基本概念.存储结构以及相关应用这三方面进行详细的学习.最后我们将学习数组的相关知识,大家要注意一下这里的数组指的是一种线性结构,与我们之前在程序设计语言当中提到的数组类型是不同的概念.好,数组我们会学习它的定义以及它的存储结构,还有用数组来实现矩阵的压缩存储.最后还会提一个特殊的矩阵叫做稀疏矩阵.好,这就是本章所要学习的重要考点.本章所学习的知识点其实并不难,它常常出现在选择题当中,但是在之后我们解决一

javascript数据结构和算法 第一章(编程体验)三

变量作用域 变量作用域就是指在一个程序中,变量的值在哪里可以被获取到.javascript函数作用域被定义为函数作用域,这意味着变量的值在定义和声明该变量的函数,包括任何在该函数的嵌套函数里是可见的. 当一个变量定义在函数的外面,在主程序中,该变量将会拥有全局作用域.这就意味着它的值可以被程序的任何地方,包括函数获取. 下面的小程序演示全局变量时如何工作的. function showScope() { return scope; } var scope = "global"; pri

第三章:1.栈和队列 -- 栈的表示及实现

前言: 栈和队列 是两种重要的线性结构.从数据结构角度来看,栈和队列也是线性表,它的特殊性在于其操作是线性表的子集,是操作受限的线性表,因此可以称作限定性的数据结构. (限定性:如.人为的规定线性表只能从表尾插入和删除结点数据元素,那么这样的线性表就是栈) 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离散事件模型 正文: 栈的定义 栈(stack) 如上所说,就是限定只能在表尾进行插入和删除的线性表.表尾 称为 栈顶(top), 表头 称为 栈底 (bottom),没有数