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

队列queue

  • 先进先出FIFO
    数组描述
  1. location(i) = i-1


    数据结构(C++实现)--队列_第1张图片
    queue1

增加元素 rear+1 O(1)
空队列rear=-1
删除元素1~rear位置的元素全部左移1位 O(n)

  1. location(i) = location(1)+i-1


    数据结构(C++实现)--队列_第2张图片
    queue2

增删都是O(1),空队列有rear

  1. location(i) = ( location(1)+i-1)%MaxSize


    数据结构(C++实现)--队列_第3张图片
    queue3

即环形队列
因为空和满时都有front=rear,所以队列不能满

给出3的实现

#include 
#include "err.h"

using namespace std;

template
class Queue
{
public:
    Queue(int MaxQueueSize = 10);
    ~Queue() {delete [] queue;}
    bool IsEmpty() const {return front==rear;}
    bool IsFull() const {return(((rear+1)%MaxSize==front)?1:0);}
    T First() const;
    T Last() const;
    Queue& Add(const T&x);
    Queue& Delete(T& x);
private:
    int front;
    int rear;
    int MaxSize;
    T *queue;
};
template
Queue::Queue(int MaxQueueSize)
{
    MaxSize = MaxQueueSize + 1;   //多申请一个空间,保证队列不会满
    queue = new T[MaxSize];
    front = rear = 0;
}

template
T Queue::First() const
{
    if (IsEmpty()) throw OutOfBounds();
    return queue[(front+1)%MaxSize];
}

template
T Queue::Last() const
{
    if(IsEmpty()) throw OutOfBounds();
    return queue[rear];
}
template
Queue& Queue::Add(const T& x)
{
    if(IsFull()) throw NoMem();
    rear = (rear+1)%MaxSize;
    queue[rear] = x;
    return *this;
}
template
Queue& Queue::Delete(T& x)
{
    if(IsEmpty()) throw OutOfBounds();
    front = (front+1)%MaxSize;
    x = queue[front];
    return *this;

}
int main()
{
    Queue q(10);
    cout << (q.IsEmpty()?"Empty":"Not Empty");
    cout << q.Last();
    return 0;
}

你可能感兴趣的:(数据结构(C++实现)--队列)