《C++实现数据结构》:队列

来源:互联网 发布:对撞机 知乎 编辑:程序博客网 时间:2024/06/11 12:28

队列是限定在表的一端插入,在表的另一端删除的线性表,是先进先出(FIFO)的线性数据结构。
队列基类如下:

#include <iostream>using namespace std;//队列基类template <typename T>class Queue{public:    virtual bool IsEmpty() const = 0;   //若队列空,则返回true    virtual bool IsFull() const = 0;    //若队列满,则返回true    virtual bool Front(T &x) const = 0; //在x中返回队头元素,操作成功则返回true    virtual bool Enqueue(T x) = 0;      //在队尾插入元素x,操作成功则返回true    virtual bool Dequeue() = 0;         //从队列中删除队头元素,操作成功则返回true    virtual bool Clear() = 0;           //清除队列中的元素};

一、队列的顺序表示
需要用到2个指针front和rear,front指向队头元素的前一单元,rear指向队尾元素。使用循环队列结构可以解决“假溢出”现象。
为使入队和出队实现循环,可以利用取余运算符。
队头指针进1:front=(front+1)%maxSize
队尾指针进1:rear=(rear+1)%maxSize
在循环队列结构下,当front==rear时为空队列,当(rear+1)%maxSize == front时为满队列。满队时实际仍有一个元素的空间未使用,这是为了与空队列的判断标准区分开。

//队列的顺序表示,循环队列template <typename T>class SeqQueue:public Queue<T> {private:    int front,rear; //front指向队头元素的前一单元,rear指向队尾元素    int maxSize;    //数组的最大长度    T *q;public:    SeqQueue(int mSize);    ~SeqQueue();    bool IsEmpty() const;   //若队列空,则返回true    bool IsFull() const;    //若队列满,则返回true    bool Front(T &x) const; //在x中返回队头元素,操作成功则返回true    bool Enqueue(T x);      //在队尾插入元素x,操作成功则返回true    bool Dequeue();         //从队列中删除队头元素,操作成功则返回true    bool Clear();           //清除队列中的元素};template <typename T>SeqQueue<T>::SeqQueue(int mSize) {    maxSize = mSize;    q = new T[maxSize];    front = rear = 0;}template <typename T>SeqQueue<T>::~SeqQueue() {    delete[]q;}template <typename T>bool SeqQueue<T>::IsEmpty() const {    return front == rear;     //在循环队列下,当front==rear时表示空队列}template <typename T>bool SeqQueue<T>::IsFull() const {    return (rear + 1) % maxSize == front;   //注意满队时列时实际仍有一个元素的空间未使用,要与空队列区分开}template <typename T>bool SeqQueue<T>::Front(T &x) const {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    x = q[(front + 1) % maxSize];    return true;}template <typename T>bool SeqQueue<T>::Enqueue(T x) {    if (IsFull()) {        cout<<"Full"<<endl;        return false;    }    rear = (rear + 1) % maxSize;    q[rear] = x;    return true;}template <typename T>bool SeqQueue<T>::Dequeue() {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    front = (front + 1) % maxSize;    return true;}template <typename T>bool SeqQueue<T>::Clear() {    front = rear;    return true;}

二、队列的链接表示
队头指针front充当链表的表头结点,队尾指针rear指向队尾结点。

//队列的链接表示template <typename T>class SingleQueue;template <typename T>class Node{    T element;    Node<T>* next;    friend class SingleQueue<T>;};template <typename T>class SingleQueue:public Queue<T>{private:    Node<T>* front;    Node<T>* rear;    bool IsFull() const {}    //若队列满,则返回truepublic:    SingleQueue();    ~SingleQueue();    bool IsEmpty() const;   //若队列空,则返回true    bool Front(T &x) const; //在x中返回队头元素,操作成功则返回true    bool Enqueue(T x);      //在队尾插入元素x,操作成功则返回true    bool Dequeue();         //从队列中删除队头元素,操作成功则返回true    bool Clear();           //清除队列中的元素};template <typename T>SingleQueue<T>::SingleQueue() {    front = new Node<T>;    front->next = NULL;    rear = front;}template <typename T>SingleQueue<T>::~SingleQueue() {    Node<T>* p;    while (front != NULL) {        p = front;        front = front->next;        delete (p);    }}template <typename T>bool SingleQueue<T>::IsEmpty() const {    if (front == rear) {        return true;    } else {        return false;    }}template <typename T>bool SingleQueue<T>::Front(T &x) const {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    Node<T> *p = front->next;    x = p->element;    return true;}template <typename T>bool SingleQueue<T>::Enqueue(T x) {    Node<T>* p = new Node<T>;    p->element = x;    p->next = NULL;    rear->next = p;    rear = p;}template <typename T>bool SingleQueue<T>::Dequeue() {    if (IsEmpty()) {        cout<<"Empty"<<endl;        return false;    }    Node<T> *p = front->next;    front->next = p->next;    delete (p);}template <typename T>bool SingleQueue<T>::Clear() {    Node<T> *p = front->next;    Node<T> *q;    while (p != NULL) {        q = p;        p = p->next;        delete (q);    }    rear = front;}

最后的测试代码:

int main() {    int n = 5;    Queue<int> *queue = new SeqQueue<int>(n);//    Queue<int> *queue = new SingleQueue<int>;    for (int i = 1; i < 5; ++i) {        queue->Enqueue(i);    }    queue->Enqueue(6);    int x;    if (queue->Front(x)) {        cout<<x<<endl;    }    queue->Dequeue();    if (queue->Enqueue(6)) {        cout<<"Successful"<<endl;    }    queue->Clear();    queue->Front(x);    return 0;}
0 0
原创粉丝点击