一、定义
先进先出(FIFO)或后进后出(LILO)
队首、队尾
队列的操作:
1、Push
2、Pop
3、Front
4、Rear
5、IsEmpty
二、代码
SequenQueue.h
#ifndef _SequenQueue_H
#define _SequenQueue_H
using namespace std;
template <class T>
class Queue
{
public:
Queue(int queueCapacity = 10);//队列长度默认为10
bool IsEmpty() const;//是否为空
T & Front() const;//取队首元素
T & Rear() const;//取队尾元素
void Push(const T & item);//从队尾插入元素
void Pop();//从队首删除元素
protected:
private:
T * queue;//动态数组
int front;//队首位置下标
int rear;//队尾位置下标
int capacity;//队列容量
};
template <class T>
Queue<T>::Queue(int queueCapacity):capacity(queueCapacity){//构造函数
if(capacity<1){
throw "Queue capacity must be > 0";
}
queue = new T[capacity];//创建动态数组模版
front = rear = 0;
}
template <class T>
inline bool Queue<T>::IsEmpty() const{
return front == rear;
}
template <class T>
void Queue<T>::Push(const T & item){
if((rear+1)%capacity == front){//队列满了,加倍
T * newQueue = new T[2*capacity];
int start = (front + 1) % capacity;//判断front的位置,并以此来判断是否发生回绕
if(start < 2){//芙蓉在第一位,没有发生回绕:no wrap
copy(queue+start,queue+start+capacity-1,newQueue);
}else{
copy(queue+start,queue+capacity,newQueue);
copy(queue,queue+rear+1,newQueue+capacity-start);
}
front = 2 * capacity - 1;
rear = capacity - 2;
capacity *= 2;
delete[] queue;
queue = newQueue;
cout<<"数组长度:"<<capacity<<endl;
}
//初级写法
// if(rear == capacity - 1){
// rear = 0;
// }else{
// rear++;
// }
rear = (rear+1) % capacity;//高水平写法。等价于上面注释掉的if-else
queue[rear] = item;
}
template <class T>
inline T & Queue<T>::Front() const{
if(IsEmpty()){
throw "Queue is empty. No front element";
}
return queue[(front + 1) % capacity];
}
template <class T>
inline T & Queue<T>::Rear() const{
if(IsEmpty()){
throw "Queue is empty. No front element";
}
return queue[rear];
}
template <class T>
void Queue<T>::Pop(){
if(IsEmpty()){
throw "Queue is empty.Cannot delete";
}
front = (front + 1)%capacity;//解决回绕
queue[front].~T();
}
#endif
main.cpp
#include <iostream>
#include "顺序队列.h"
using namespace std;
int main()
{
cout << "测试顺序队列" << endl;
Queue<char> Q(8);
Q.Push('A');
Q.Push('b');
cout<<Q.Front()<<","<<Q.Rear()<<endl;
return 0;
}