跳转至

队列

队列的定义

队列结构

  • 特点:先进先出 结构,最先到达队列的结点将最早被删除
  • 相关概念:
    • 队列头(front):结构的首部(先进队列结点的位置)
    • 队列尾(rear):结构的尾部(后进队列结点的位置)
    • 出队列(dequeue):结点从队列头删除
    • 入队列(enqueue):结点在队列尾位置插入
    • 空队列:队列中结点个数为零
  • 队列的抽象类
#ifndef QUEUE_H
#define QUEUE_H
#include <iostream>
#include <bits/stdc++.h>
using namespace std;

template <class elemType>
class queue
{
public:
    virtual ~queue() {}
    virtual bool isEmpty() const = 0;
    virtual void enQueue(const elemType &x) = 0;
    virtual elemType deQueue() = 0;
    virtual elemType getHead() const = 0;
};

#endif

队列的顺序实现

  • 队列头位置固定的顺序实现

  • 队列头位置不固定的顺序实现

  • 循环队列

循环队列的顺序实现

#include "4-1-queue.h"

template <class elemType>
class seqQueue: public queue<elemType>
{
    private:
        elemType *elem;
        int maxSize;
        int front, rear;
        void doubleSpace();
    public:
        seqQueue(int size = 10);
        ~seqQueue() {delete [] elem;}
        bool isEmpty() const {return front == rear;}
        void enQueue(const elemType &x);
        elemType deQueue();
        elemType getHead() const {return elem[(front+1)%maxSize];}
};

template <class elemType>
seqQueue<elemType>::seqQueue(int size)
{
    elem = new elemType[size];
    maxSize = size;
    front = rear = 0;
}

template <class elemType>
void seqQueue<elemType>::doubleSpace()
{
    elemType *tmp = elem;
    elem = new elemType[2*maxSize];
    for (int i = 1; i < maxSize; ++i)
    {
        elem[i] = tmp[(front+i)%maxSize];
    }
    front = 0;
    rear = maxSize;
    maxSize *= 2;
    delete [] tmp;
}

template <class elemType>
void seqQueue<elemType>::enQueue(const elemType &x)
{
    if ((rear+1)%maxSize == front) doubleSpace();
    rear = (rear+1)%maxSize;
    elem[rear] = x;
}

template <class elemType>
elemType seqQueue<elemType>::deQueue()
{
    front = (front+1)%maxSize;
    return elem[front];
}

队列的链接实现

队列的链接实现结构

#include "4-1-queue.h"

template <class elemType>
class linkQueue: public queue<elemType>
{
    private:
        struct node
        {
            elemType data;
            node *next;
            node(const elemType &x, node *N = NULL)
            {
                data = x;
                next = N;
            }
            node():next(NULL) {}
            ~node() {}
        };
        node *front, *rear;
    public:
        linkQueue() {front = rear = NULL;}
        ~linkQueue();
        bool isEmpty() const {return front == NULL;}
        void enQueue(const elemType &x);
        elemType deQueue();
        elemType getHead() const {return front->data;}
};

template <class elemType>
linkQueue<elemType>::~linkQueue()
{
    node *tmp;
    while (front != NULL)
    {
        tmp = front;
        front = front->next;
        delete tmp;
    }
}

template <class elemType>
void linkQueue<elemType>::enQueue(const elemType &x)
{
    if (rear == NULL)
    {
        front = rear = new node(x);
    }
    else
    {
        rear->next = new node(x);
        rear = rear->next;
    }
}

template <class elemType>
elemType linkQueue<elemType>::deQueue()
{
    node *tmp = front;
    elemType value = front->data;
    front = front->next;
    if (front == NULL) rear = NULL;
    delete tmp;
    return value;
}

队列的应用

  • 火车车厢重排问题
  • 排队系统的模拟