线性结构的常见应用之一 队列

定义:一种可以实现“先进先出”的存储结构

分类

    链式队列 --  用链表实现

    静态队列 --  用数组实现

            静态队列通常都必须是循环队列

            循环队列的讲解:

                1.静态队列为什么必须是循环队列

                  

                2.循环队列需要几个参数来确定

                   需要两个参数来进行确定:front   rear

                      

                3.循环队列各个参数的含义

                  2个参数在不同的场合有不同的含义

                      建议初学者先记住,后面再想

                          1)、队列初始化

                                front 和 rear 的值都是零

                          2)、队列非空

                                front 代表的是队列的第一个元素

                                rear 代表的是队列的最后一个有效元素的下一个元素

                          3)、队列空

                                front 和  rear 值相等,但不一定为零

                4.循环队列入队伪算法讲解

                    1.将值存入r所代表的位置

                    2.最容易犯得错误的写法:rear = rear + 1;

                     正确的写法:rear = (rear+1)%(数组的长度);

                5.循环队列出队伪算法讲解

                    1.出队和入队是一致的,front=(front+1)%(数组的长度);

                6.如何判断循环队列为什么为空

                    1.如果两个参数的值相等,那么该队列就一定为空

                7.如何判断循环队列是否已满

                    两种方式:

                      1、多增加一个标识位

                      2、少用一个元素(也就是判断两者是不是紧挨着)

                        if((r+1)%(数组的长度)==f){

                          已满

                        }else{

                          不满

                        }

        

代码实现:

#include <stdio.h>
#include <malloc.h>

typedef struct QUEUE {
    int *pBase;
    int front;
    int rear;
} QUEUE;

void init(QUEUE* pQ);
bool en_Queue(QUEUE* pQ,int val);
bool full_QUEUE(QUEUE* pQ);
bool traverse_Queue(QUEUE* pQ);
bool empty_Queue(QUEUE* pQ);
bool out_Queue(QUEUE * pQ,int *val);

int main(void) {
    QUEUE pQ;
    int val;
    init(&pQ);
    en_Queue(&pQ,1);
    en_Queue(&pQ,2);
    en_Queue(&pQ,3);
    en_Queue(&pQ,4);
    en_Queue(&pQ,5);
    en_Queue(&pQ,6);
    en_Queue(&pQ,7);
    en_Queue(&pQ,8);

    if(traverse_Queue(&pQ)) {
        printf("为空!\n");
    }
    if(out_Queue(&pQ,&val)) {
        printf("出队成功!出队的值为%d!\n",val);
    } else {
        printf("为空!\n");
    }
    if(traverse_Queue(&pQ)) {
        printf("为空!\n");
    }
    return 0;
}

void init(QUEUE* pQ) {
    pQ->pBase = (int *)malloc(sizeof(int) * 6);
    pQ->front = 0;
    pQ->rear = 0;
}

bool en_Queue(QUEUE* pQ,int val) {
    if ( full_QUEUE(pQ) ) {
        return false;
    } else {
        pQ->pBase[pQ->rear] = val;
        pQ->rear = (pQ->rear+1) % 6;

        return true;
    }
}

bool full_QUEUE(QUEUE* pQ) {
    if ( (pQ->rear + 1) % 6 == pQ->front  )
        return true;
    else
        return false;
}

bool traverse_Queue(QUEUE* pQ) {
    if(empty_Queue(pQ)) {
        return true;
    } else {
        int i = pQ->front;
        while(i != pQ->rear) {
            printf("%d   ",pQ->pBase[i]);
            i = (i+1)%6;
        }
        printf("\n");
        return false;
    }
}

bool empty_Queue(QUEUE* pQ) {
    if(pQ->front == pQ->rear) {
        return true;
    } else {
        return false;
    }
}

bool out_Queue(QUEUE * pQ,int *val) {
    if(empty_Queue(pQ)) {
        printf("栈表为空!\n");
        return false;
    } else {
        *val = pQ->pBase[pQ->front];
        pQ->front = (pQ->front+1)%6;
        return true;
    }
}
时间: 2024-12-15 01:46:04

线性结构的常见应用之一 队列的相关文章

线性结构的常见应用之一 栈

栈的定义: 一种可以实现 " 先进后出 " 的存储结构. 栈类似于箱子 栈的分类(主要是看存储的方式连续还是不连续): 静态栈:以数组的形式生成的栈. 动态栈:以链表的形式生成的栈. 栈的算法: 出栈 压栈 栈表的实现: # include <stdio.h> # include <malloc.h> # include <stdlib.h> //先定义结点类型 typedef struct Node { int data; struct Node

常见的线性结构

目录 前言 数组 数组介绍 自定义数组 实现数组的增删改查方法 动态数组 时间复杂度分析 栈 栈介绍 定义栈接口 基于数组实现栈的基本操作 使用栈实现"括号匹配"问题 队列 队列介绍 定义队列接口 数组队列 循环队列 数组队列和循环队列的性能比较 链表:最基础的动态数据结构 链表介绍 实现链表的增删改查操作 通过自定义链表实现栈 通过自定义链表实现队列 递归 前言 ??本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间

队列的存储结构和常见操作(c 语言实现)

一.队列(queue) 队列和栈一样,在实际程序的算法设计和计算机一些其他分支里,都有很多重要的应用,比如计算机操作系统对进程 or 作业的优先级调度算法,对离散事件的模拟算法,还有计算机主机和外部设备运行速度不匹配的问题解决等,很多很多.其实队列的本质还是线性表!只不过是一种特殊的或者说是受限的线性表,是这样的: 1).限定在表的一端插入.另一端删除. 插入的那头就是队尾,删除的那头就是队头.也就是说只能在线性表的表头删除元素,在表尾插入元素.形象的说就是水龙头和水管,流水的水嘴是队头,进水的

数据结构和算法-数据结构-线性结构-栈和队列

 ################################################## """ 三.线性结构 (1)栈 1.定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表. 2.栈的特点:后进先出(last-in,first-out),简称LTFO表 这种数据结构的特点: 就是像是杯子或者是弹夹,电梯, 存储的时候从底部开始,读取的时候从顶部开始,具备这种特点就是栈 就是后进先出, 存储的时候就可以从顺序表或者链表就可以实现, 只让从一

数据结构 线性结构(数组[列表] ,链表 单链表的增删改查**, 线性结构的应用 队列 栈[函数的调用**]),非线性结构 树

数据结构 参考:http://lupython.gitee.io/ 线性结构 就是能够用一根线串起来的数据结构 数组 (列表) 问:申请数组的前提条件是啥? a[12]?内存需要满足的条件? 答:内存必须有一块连续的内存空间 int a[7] : 声明一个数组,这个数组的数组名是 a, 数组的大小是 7, 数组元素的类型是整型. int a[7] = array(1,2,3,4,5,6,7) 问:如何申请内存? 答:C,C++语言,申请:mallco (28).释放:free(28) 问:int

线性链表其他种类(静态,双向,循环)的存储结构和常见操作

一.静态单链表 在不支持动态空间分配的环境中,要使用链表存储数据,那么可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针链来构成链式结构. //既然是静态链表,那么可以使用一维数组实现存储,java没有指针,那么就用这来使用链表结构 //在不支持动态空间分配的环境中,要使用链式结构技术,可采用静态链表的方法:即在一块预分配的存贮空间中,用下标作为指针. //存储结构:在数组中增加一个“指针”域,存放下一元素在数组中的下标.且0为代表空指针 //设S为SLinkList型变量,若第i

数据结构1 线性结构

数据结构是指数据元素的结合及元素间的相互关系和构造方法.元素之间的相互关系是数据的逻辑结构,元素关系的存储形式成为存储结构.数据结构按照逻辑关系的不同分为线性结构和非线性结构两大类.其中线性结构是最基本的结构,元素顺序排列,常见的有线性表.栈.队列.数组.串. 一.线性表 1.线性表是最简单也是最常用的一种线性结构.一个线性表示n(n>=0)个元素的有限序列,非空线性表的特点为: 存在唯一的一个"第一个"元素: 存在唯一的一个"最后一个"元素: 除第一个元素外

线性结构和非线性结构

线性结构和非线性结构同属于数据结构中的逻辑结构类型 线性结构是指该结构中的节点之间存在一对一的关系.其特点是开始节点和终端节点都是唯一的,除了开始节点和终端节点外,其余节点都有且仅有一个直接前驱,有且仅有一个直接后继.此类型的存储结构有:顺序表(数组).链表.堆栈结构.队列结构等 非线性结构又包括集合.树形结构.图形结构或网状结构,特点是数据元素之间存在一个对多个或多个对多个的关系,其中集合是一种关系极为松散的结构.

2、线性结构——数据结构【基础篇】

线性结构 线性结构的4大特点: 1.有一个结点只有前驱 2.有一个结点只有后继 3.其他结点既有一个前驱也有一个后继 4.在逻辑上相邻在物理上也相邻数据的逻辑关系叫做线性结构 线性结构的3大类型: 1.线性表--线性表是n个数据元素的有限序列 存储结构: 顺序存储对应一组操作:顺序表 链式存储对应一组操作:单向链表.双向链表.循环链表 2.栈--限定只在表的一端(表尾)进行插入和删除操作的线性表:允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),其这一端被固定了. 存储结构