队列及其操作

队列

队列的定义

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

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

队的特点

  • 先进先出(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;
}

推荐阅读更多精彩内容

  • 数据结构和算法(1)线性表实现 数据结构和算法(2)单向循环链表的创建插入删除实现 数据结构和算法(3)双向链表与...
    孔雨露阅读 347评论 0 1
  • C#数据结构:顺序队列 1、 顺序队列的假溢出现象 队列的一种顺序存储称为顺序队列。与顺序栈类似,在队列的顺序存储...
    lijianfex阅读 1,524评论 0 1
  • 数据结构 第7讲 循环队列 过了一段时间,小张再也受不了...
    rainchxy阅读 7,670评论 4 15
  • 队列 队列的基本概念 队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除;向队列中插入元...
    ribose阅读 357评论 0 2
  • 一、栈 1.1 栈的定义 栈(Stack):只允许在一端进行插入或删除操作的线性表。首先栈是一种线性表,但是限定这...
    末雨潮声阅读 332评论 0 0
  • 大纲:*掌握栈的定义、栈的存贮结构及基本操作的实现。理解用栈实现表达式的求值,递归过程及实现。掌握队列的定义、存贮...
    堂前雪半阅读 489评论 0 0
  • 队列的基本概念 1 队列的定义 队列(Queue):队列简称队,也是一种操作受限的线性表,只允许在表的一端进行插入...
    1nvad3r阅读 370评论 0 0
  • 队列:只允许在一端进行插入操作,在另一端进行删除操作的线性表。队列是一种先进先出的线性表,简称FIFO,把允许插入...
    卡布奇诺_95d2阅读 156评论 0 0
  • 注:不足及错误请指正 +qq1366963396讨论 队列(queue)是只允许在一端进行插入操作,而在另一端进行...
    lxr_阅读 563评论 0 0
  • 栈 栈的数学性质 n个不同元素进栈,出栈元素不同排列的个数为,公式称为卡特兰数。 栈的顺序存储 栈是一种操作受限的...
    喜忧参半阅读 682评论 0 1
  • 一、队列的概念介绍 提到队列这个词,或许你不会感到陌生,在我们的生活中,应用到队列这个概念的场景非常之多。我们日常...
    IT之旅阅读 255评论 0 1
  • 第三章 栈、队列和数组 栈和队列可以看作是特殊的线性表,它们是 运算受限的线性表。 栈 栈的基本概念 栈是 只能在...
    陈_MY阅读 179评论 0 0
  • 引言 中午在食堂打饭,真是一个令人头疼的事情,去食堂的路上也总是步伐匆匆,为什么啊,这还用说,迟一点去,你就会知道...
    BWH_Steven阅读 303评论 0 1
  • 栈和队列是两种重要的数据结构,栈和队列是特殊的线性表。 1、栈(stack)是限定仅在表的一端进行插入或删除操作的...
    云先僧阅读 166评论 0 0
  • 队列的概念 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rea...
    _涼城阅读 231评论 0 1
  • ![Flask](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW...
    极客学院Wiki阅读 6,268评论 0 3
  • 不知不觉易趣客已经在路上走了快一年了,感觉也该让更多朋友认识知道易趣客,所以就谢了这篇简介,已做创业记事。 易趣客...
    Physher阅读 2,951评论 1 2
  • 双胎妊娠有家族遗传倾向,随母系遗传。有研究表明,如果孕妇本人是双胎之一,她生双胎的机率为1/58;若孕妇的父亲或母...
    邺水芙蓉hibiscus阅读 3,214评论 0 2
  • 今天理好了行李,看到快要九点了,就很匆忙的洗头洗澡,(心存一份念想,你总会打给我的🐶)然后把洗头液当成沐浴液了😨,...
    bevil阅读 2,445评论 1 1
  • 那年我们15,像阳光一样温暖的年纪。每天我都会骑自行车上学,路过田野,工厂,医院,村庄,有微风,有阳光,有绿...
    木偶说爱你阅读 2,130评论 0 3