队列的实现

顺序队列

循环队列:(此代码没有 队满后进行扩大队 的操作)

#include <iostream>
using namespace std;

template <class T>
class Queue {
private:
    T* queue;
    int front;//队首元素下标
    int rear;//队尾元素后一个空位置下标
    int maxsize;
public:
    Queue(int max = 10);
    bool IsEmpty();
    T& GetFront();
    T& GetRear();
    void Show();
    bool enQueue(T data);
    bool deQueue();

};

template<class T>
Queue<T>::Queue(int max) {
    queue = new T[max];
    front = 0;
    rear = 0;
    maxsize = max;
}

template<class T>
inline bool Queue<T>::IsEmpty() {
    return front == rear;
}

template<class T>
T& Queue<T>::GetFront() {
    try {
        if (IsEmpty())throw "Queue is empty! Can't get element";
    }
    catch (char const* s) {
        cout << s << endl;
    }
    return queue[front];
}

template<class T>
T& Queue<T>::GetRear() {
    try {
        if (IsEmpty())throw "Queue is empty! Can't get element";
    }
    catch (char const* s) {
        cout << s << endl;
    }
    return queue[(rear - 1 + maxsize) % maxsize];
}

template<class T>
void Queue<T>::Show() {
    try {
        if (IsEmpty())throw "Queue is empty! Can't show element";
    }
    catch (char const* s) {
        cout << s << endl;
    }
    for (int i = 0; i < (rear - 1 + maxsize) % maxsize - front + 1; i++) {
        cout << queue[front + i] << " ";
    }
    cout << endl;
}

template<class T>
bool Queue<T>::enQueue(T data) {
    //队满
    if ((rear + 1) % maxsize == front) {
        return false;
    }
    else {
        queue[rear] = data;
        rear = (rear + 1) % maxsize;
        return true;
    }
}

template<class T>
bool Queue<T>::deQueue() {
    //队空
    if (IsEmpty()) {
        return false;
    }
    else {
        front = (front + 1) % maxsize;
        return true;
    }
}

int main()
{
    Queue<int> queue;
    int table[5] = { 1,2,3,4,5 };
    for (int i = 0; i < 5; i++) {
        queue.enQueue(table[i]);
    }
    
    queue.deQueue();queue.deQueue();
    queue.enQueue(10);
    queue.Show();
    cout<<queue.GetRear();
}

队满后扩大队的操作可参考:https://www.bilibili.com/video/BV1AW411k7rw?p=13
(视频中,front是指向第一个元素的前面的空位置,rear指向最后一个元素,和我的有所不同)


链式队列

#include <iostream>
using namespace std;
template <class T> class Queue;

template <class T>
class Node {
public:
    friend class Queue<T>;
    Node() {};
    Node(T num) {
        data = num;
        next = NULL;
    }
private:
    T data;
    Node<T>* next;
};

template <class T>
class Queue {
public:
    Queue() {
        front = NULL;
        rear = NULL;
    }
    void enQueue(T num);
    void deQueue();
    T& GetRear();
    T& GetFront();
    void show();
    bool IsEmpty();
private:
    Node<T>* front;
    Node<T>* rear;
};

template <class T>
void Queue<T>::enQueue(T num){
    Node<T>* pnew = new Node<T>(num);
    if ( !front ) {
        front = pnew;
        rear = pnew;
    }
    else {
        rear->next = pnew;
        rear = pnew;
    }
}

template <class T>
void Queue<T>::deQueue() {
    Node<T>* p = front;
    front = p->next;
    p->next = NULL;
    delete p;
}


template <class T>
T& Queue<T>::GetFront() {
    try {
        if (IsEmpty()) throw "error! The Queue is empty!";
    }
    catch (const char* str) {
        cout << str << endl;
    }
    
    return front->data;
}

template <class T>
T& Queue<T>::GetRear() {
    try {
        if (IsEmpty()) throw "error! The Queue is empty!";
    }
    catch (const char* str) {
        cout << str << endl;
    }

    return rear->data;
}

template <class T>
void Queue<T>::show() {
    try {
        if (IsEmpty()) throw "error! The Queue is empty!";
    }
    catch (const char* str) {
        cout << str << endl;
    }
    Node<T>* p = front;
    while (p) {
        cout << p->data << " ";
        p = p->next;
    }cout << endl;
}

template <class T>
bool Queue<T>::IsEmpty() {
    return front == NULL;
}

int main()
{
    Queue<char> queue;
    char table[5] = { 'A','B','C','D','E' };
    for (int i = 0; i < 5; i++) {
        queue.enQueue(table[i]);
    }
    queue.show();
    queue.deQueue();
    queue.show();
    cout<<"front:"<<queue.GetFront()<<endl;
    cout << "rear:" << queue.GetRear() << endl;
    queue.deQueue(); queue.deQueue(); queue.deQueue(); queue.deQueue();
    queue.show();
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构 第7讲 循环队列 过了一段时间,小张再也受不了...
    rainchxy阅读 12,973评论 4 16
  • 1、队列的基本概念 和堆栈一样队列也是一种特殊的线性表,队列的数据元素及数据元素间的逻辑关系和线性表是完全相同的,...
    风紧扯呼阅读 5,498评论 0 1
  • 栈 栈的英文单词是Stack,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入,...
    Jack921阅读 5,424评论 0 5
  • 队列 队列的基本概念 队列是一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除;向队列中插入元...
    ribose阅读 3,751评论 0 2
  • 改变,百度词条的解释是:“事物变得和原来不一样;改换、更改”。身边有很多人,希望自己的生活发生一些改变,例...
    Eva伊伊阅读 3,730评论 0 0