队列(queue):插入和删除在不同端进行的线性表。
队尾(rear):添加新元素的一端。
队首(front):删除元素的一端。
时间有序表:先进先出(FIFO) 特征的线性结构。
队空:
front=0;
rear=-1;
插入A元素:
front=0;
rear=0;
队列满:
rear=MaxSize-1
空队列:front==rear;
入队列:sq[++rear]=x;
出队列:x=sq[++fromt];
当front!=-1时,存在假溢出;
解决队列溢出的方法:
循环队列
–基本思想:把队列设想成环形,让sq[0]接在sq[mSize-1]之后
队列的大小为M,若rear+1==M,则令rear=0;
–入队: rear=(rear+1)%mSize; sq[rear]=x;
–出队: front=(front+1)%mSize; x=sq[front];
队空:front==rear
队满:(rear+1)%mSize==front
队中结点的个数:(rear-front+mSize)%mSize
#include<iostream>
using namespace std;
class arrQueue{
private:
int mSize;
int front;
int rear;
int *st;
public:
arrQueue(int size){
mSize=size+1; //浪费一个存储空间以区别空队列和满队列
front=rear=0;
st=new int[mSize];
}
~arrQueue(){ delete[]st;}
void clear(){ front=rear; }
bool enQueue(int item);
bool deQueue(int & item);
bool getFront(int & item);
void show();
};
void arrQueue::show(){
if (front==rear)
{
cout<<"空栈!!!\n";
}
else{
int k=(rear-front+mSize)%mSize;
int j=front;
cout<<"此队列为:\n";
for (int i=0;i<k;i++)
{
cout<<st[j]<<endl;
j=(j+1)%mSize;
}
}
}
bool arrQueue::getFront(int & item){
if (front==rear)
{
cout<<"空栈,无法取出!!!\n";
return false;
}
item=st[front];
return true;
}
bool arrQueue::deQueue(int & item){
if (front==rear)
{
cout<<"空栈,无法进行删除\n";
return false;
}
item=st[front];
front=(front+1)%mSize;
return true;
}
bool arrQueue::enQueue(int item){
if ((rear+1)%mSize==front)
{
cout<<"队列已满,不能入队列!!!"<<endl;
return false;
}
st[rear]=item;
rear=(rear+1)%mSize;//注意在循环队列中,rear指向的是空,而不是最后一个
return true;
}
int main(){
arrQueue a(3);
a.enQueue(1);
a.enQueue(2);
a.enQueue(3);
a.enQueue(4);
a.show();
int temp=0;
a.deQueue(temp);
cout<<temp<<endl;
a.getFront(temp);
cout<<temp<<endl;
return 0;
}