队列(queue)是先进先出的数据结构,存储方式可以是数组也可以是链表。如果用数组存储,一般采用循环队列的方式。
所以需记住几个关键点:
队头指针进1:front = (front+1)%maxsize
队尾指针进1:rear = (rear+1)%maxsize
判断队空:front = rear
判断队满:front = (rear+1)%maxsize,这里,队满的时候队尾和队头之间空有一个元素,以此来避免和front=rear混淆
定义头文件
/*队列用数组存储的一般用循环队列
front = (front+1)%maxsize
rear = (rear+1)%maxsize
队头指向存储的第一个元素,而队尾指向的是存储的最后一个元素的下一个位置
所以,在队列满的时候,队头和队尾之间是空有一个元素的,否则当front==rear时,
会混淆满队和空队
空队:front == rear
满队:(rear+1)%maxsize ==front
*/
#include <assert.h>
#include<iostream>
using namespace std;
template<class T>
class SeqQueue{
public:
SeqQueue(int sz=50);
~SeqQueue();
bool EnQueue(const T& x);
bool DeQueue();
T getFront(); //获取队头元素
bool makeEmpty(){front = rear =0; return true;}
bool isEmpty()const{return (front==rear)?true:false;}
bool isFull()const{return ((rear+1)%maxsize==front)?true:false;}
int getsize()const{return (rear-front+maxsize)%maxsize;} //获取队列元素个数
private:
int front,rear;
T* element;
int maxsize;
};
#include "queue.h"
template<class T>
SeqQueue<T>::SeqQueue(int sz):maxsize(sz):front(0):rear(0){
element = new T[maxsize];
assert(element!=NULL);
}
template<class T>
bool SeqQueue<T>::EnQueue(const T& x){
if(isFull()==true)return false;
element[rear]=x;
rear = (rear+1)%maxsize;
return true;
}
template<class T>
bool SeqQueue<T>::DeQueue(){
if(isEmpty()==true)return false;
T x = element[front];
front = (front+1)%maxsize;
delete x;
return true;
}
template<class T>
T SeqQueue<T>::getFront(){
if(isEmpty()==true)return -1;
return element[front];
}