数据结构和算法(1) ---- Queue 的原理和实现

Queue 的定义和结构

队列(Queue) 是只允许在一端进行插入,在另一端进行删除的线性表
队列是一种先进先出(First In First Out)的线性表,简称 FIFO(First IN First OUT), 允许插入的一端称为队尾, 允许删除的一端称为队列头

队列的基本结构如下图所示:
queue struct

Queue 的抽象数据类型

队列也有线性表的各种操作,不同的是插入元素只能在队列尾,删除元素只能在对列头进行:
队列的抽象结构如下所示:

ADT Queue(队列)
Data:
    同线性表, 元素具有相同的类型,相邻的元素具有前驱和后继关系
Operation:
    InitQueue(Q*)
    DestroyQueue(Q*)
    isEmpty(Q*)
    isFull(Q*)
    dequeue(Q*, *e)
    enqueue(Q*, e)
    queueSize(Q)
endADT

队列有多种实现方式,比如 静态数组,动态数组,单链表,双链表等

静态数组实现Queue

静态数组实现队列的基本原理:

  • 建立一个 MAX_SIZE 的数组, 用于存放 Queue 中的元素
  • 建立int类型 queue->rear 代表队列尾, 每次 enqueue 一个元素时,queu->rear 指向最新的元素位置
    staticArrayEnqueue
  • 建立 queue->front 代表队列头, 每次 dequeue 一个元素,从 queue->front 位置处取出数据,并且最后其指向下一个元素位置
    StaticArrayDequeue
  • queue->rearqueue->front 相等时,queue->frontqueue->rear都重新设置为 0,此时队列为空,表示重新开始存储数据
    StaticArrayEqual
    参考代码如下:
#define MAX_SIZE 100
typedef struct {
   
   
    int data[MAX_SIZE];
    int front;
    // queue 尾端的索引
    int rear;
}Queue;

void Queueinit(Queue* queue) {
   
   
    queue->front = -1;
    queue->rear = -1;
}

int isEmpty(Queue* queue) {
   
   
    return (queue->front == -1 && queue->rear == -1);
};

int isFull(Queue* queue) {
   
   
    // queue->rear == MAX_SIZE - 1  queue->front = 0
    //return (queue->rear + 1)%MAX_SIZE == queue->front;
    if((queue->rear + 1 - queue->front) == MAX_SIZE) {
   
   
        return 1;
    }

    return 0;
};

void enqueue(Queue* queue,int item) {
   
   
    if(isFull(queue)) {
   
   
        fprintf(stderr,"queue is full. \n");
        return;
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值