数据结构——队列(C++实现)

来源:互联网 发布:mac 便笺 保存位置 编辑:程序博客网 时间:2024/05/23 00:05

什么是队列?

队列简而言之就是先入先出(FIFO)的一种数据结构。队列的操作与栈操作类似。有如下操作:

  • clear()——清空队列
  • isEmpty()——判断队列是否为空
  • enqueue(el)——在队列尾部加入元素el
  • dequeue()——弹出队列的第一个元素
  • firstEl()——返回队列的第一个元素,但不删除该元素

代码实现如下:(用链表实现)

#include <list>template<class T>class Queue {public:    Queue() {     }    void clear() {        lst.clear();    }    bool isEmpty() const {         return lst.empty();      }    T& front() {         return lst.front();      }    T dequeue() {        T el = lst.front();        lst.pop_front();        return el;    }    void enqueue(const T& el) {        lst.push_back(el);    }private:    list<T> lst;};

循环队列

循环队列其实和循环链表差不多,只不过循环队列只能从尾部插入数据,从头部弹出数据。上面一般的队列用链表实现的,下面的循环队列采用数组实现。需要注意的是循环队列是有容量限制的,你创建一个循环队列时就要定义循环队列的大小,不能像一般队列一样,可以随时增大。
代码实现如下:

// circular_queue.cpp : 循环队列数组实现#include "stdafx.h"#include<iostream>#include<assert.h>using namespace std;
//T 数据类型,size循环队列大小template<typename T,size_t size=10>class CircularQueue{public:    CircularQueue():front(0),rear(0){}    virtual ~CircularQueue(){}    bool isEmpty() const{   //是否为空队列        return front == rear;    }    //在判断是否为满队列时,有不同的方法,这里采用少用一个元素空间,约定以队列头指针在队列尾指针的下一位置作为队列满的标志。    //当然,也可以采用一个独立的标识位标识,这里不采取这种方法。    bool isFull() const{        return front==(rear+1)%(size+1);    }    void push(const T& e){//入队列        if(isFull())            return;        rear=(rear+1)%(size+1);        data[rear]=e;    }    void pop(){//弹出队列        if(isEmpty())            return;        front=(front+1)%(size+1);    }    T top() const{        assert(!isEmpty());        return data[(front+1)%(size+1)];    }    void clear(){//清空队列        front=rear=0;    }protected:    int front;    int rear;    T data[size+1];};
int _tmain(int argc, _TCHAR* argv[]){    CircularQueue<int,3> m_queue;    m_queue.push(1);    m_queue.push(2);    m_queue.push(3);    cout<<m_queue.top();    return 0;}

标准模版库中的队列

代码示例:

#include "stdafx.h"#include<iostream>#include<algorithm>#include<stack>#include<queue>#include<list>using namespace std;int main(){    std::queue<int> q1;    queue<int, std::list<int>> q2;    for (int i = 1; i < 4; i++)        q1.push(i);    for (int i = 4; i < 7; i++)        q2.push(i);    while (!q1.empty())    {        cout << q1.front()<<" ";        q1.pop();    }    cout << endl;    while (!q2.empty())    {        cout << q2.front() << " ";        q2.pop();    }    cout << endl;    system("pause");    return 0;}

优先队列

队列中还有一个编程时经常用到的优先队列(Priority Queue),在优先对列中,根据元素的优先级以及在队列中的当前位置决定出队列的顺序。
//更多详细内容以后补充

原创粉丝点击