美文网首页
队列及其操作

队列及其操作

作者: 无聊的CairBin | 来源:发表于2021-12-18 18:15 被阅读0次

队列

队列的定义

队列简称队,是一种受限制的线性表,仅允许在表的一端插入,在表的另一端进行删除。

  • 进行插入的一端叫做队头
  • 进行删除的一端叫做队尾

队的特点

  • 先进先出(FIFO)

顺序队(循环队列)

顺序队主要以循环队列的形式出现

循环队列的要素

  • 队空状态 qu.rear == qu.front
  • 队满状态 (qu.rear+1)%MAXSIZE == qu.front

结构体定义

#define MAXSIZE 1024

typedef struct _Queue
{
    int data[MAXSIZE];  //数据
    int front;  //队首指针
    int rear;   //队尾指针
}SqQueue;

操作

采用 p = (p+1)%MAXSIZE;而不是p++的方式移动指针是为了能保证循环再利用性,使其在超过MAXSIZE后能重新回到原始位置

否则一个队只存满再全部取出后就不能再利用了

初始化

//初始化循环队列
void initQueue(SqQueue &qu)
{
    qu.front = qu.rear = 0;
}

判断队空

//判断队空
//队空返回真,否则返回假
bool isQueueEmpty(SqQueue qu)
{
    if(qu.front == qu.rear) return true;
    else return false;
}

判断队满

//判断队满
//队满返回真,否则假
bool isQueueFull(SqQueue qu)
{
    if((qu.rear + 1) % MAXSIZE == qu.front)
        return true;
    else
        return false;
}

进队

//进队
bool enQueue(SqQueue &qu, int e)
{
    //判断队满
    if(isQueueFull(qu)) return false;
    //若未满,先移动尾指针再存元素
    qu.rear = (qu.rear + 1) % MAXSIZE;
    qu.data[qu.rear] = e;

    return true;
}

出队

//出队
bool deQueue(SqQueue &qu, int &e)
{
    //判断队空
    if(isQueueEmpty(qu)) return false;
    //若不为空,则先移动头指针(因为等于0的时候并无元素,所以可以先移动指针)
    qu.front = (qu.front + 1) % MAXSIZE;
    e = qu.data[qu.front];

    return true;
}

链队

链队的要素

  • 队空状态 lqu->rear == NULLlqu->front == NULL
  • 队满状态不存在(假设内存无限大)

结构体定义

//储存数据的链队结点
typedef struct QNode
{
    int data;   //数据域
    struct QNode *next; //指针域
}QNode;

//头结点定义,用于指示队头和队尾
typedef struct _LiQueue
{
    QNode *front;
    QNode *rear;
}LiQueue;

操作

初始化

//初始化
bool initQueue(LiQueue* &lqu)
{
    lqu = new LiQueue;
    if(!lqu) return false;

    lqu->front = lqu->rear = NULL;

    return true;
}

判断队空

//判断队空,队空返回真,否则假
bool isQueueEmpty(LiQueue *lqu)
{
    if(!lqu->rear || !lqu->front)
        return true;
    else
        return false;
}

进队

//入队
bool enQueue(LiQueue* &lqu, int e)
{
    QNode *node = new QNode;
    if(!node) return false;

    node->data = e;
    node->next = NULL;

    //若队为空,则新结点即时队首结点又是队尾结点
    if(!lqu->rear)
        lqu->rear = lqu->front = node;
    else{
        lqu->rear->next = node;
        lqu->rear = node;
    }

    return true;
}

出队

//出队
bool deQueue(LiQueue* &lqu, int &e)
{
    QNode *p;

    //判断队空
    if(!lqu->rear) return false;
    else p = lqu->front;

    //当队中只有一个保存数据的结点时需特殊操作
    if(lqu->front == lqu->rear)
        lqu->rear = lqu->front = NULL;
    else
        lqu->front = lqu->front->next;

    e = p->data;
    delete p;

    return true;
}

相关文章

  • 队列及其操作

    队列 队列的定义 队列简称队,是一种受限制的线性表,仅允许在表的一端插入,在表的另一端进行删除。 进行插入的一端叫...

  • IOS多线程总结

    目录 简述 NSThread GCD操作与队列异步操作并行队列同步操作并行队列同步操作串行队列异步操作串行队列队列...

  • iOS NSOperation笔记

    操作 NSOperation操作队列 NSOperationQueues主队列NSOperationQueue *...

  • 利用链表实现队列

    队列成员变量: 队列长度 队列头节点 队列尾节点队列方法: 队列包含元素个数 队列是否为空 进队操作 出队操作 d...

  • 蓝杯二十二

    /*队列操作问题描述?队列操作题。根据输入的操作命令,操作队列(1)入队、(2)出队并输出、(3)计算队中元素个数...

  • 6.队列Queue

    目录:1.队列的定义2.队列的图解3.队列定义操作4.队列的实现 1.队列的定义 2.队列的图解 3.队列定义操作...

  • 堆和优先队列

    堆又称为优先队列,其通常包括至少两种操作:入队操作和出队操作。 普通队列与优先队列 普通队列:先进先出,后进后出优...

  • iOS主要知识总结--多线程之操作队列

    操作队列(NSOperation) 操作队列的几种常用方法 1. NSInvocationOperation 2....

  • 9.阻塞队列和线程池

    阻塞队列 特性 队列是空的时候,从队列获取元素的操作会被阻塞 队列是满的时候,往队列添加元素的操作会被阻塞 实现 ...

  • python实现栈和队列及其基本操作

    python实现栈 class MyStack:# 模拟栈 def __init__(self):self.it...

网友评论

      本文标题:队列及其操作

      本文链接:https://www.haomeiwen.com/subject/isvgfrtx.html