队列

来源:互联网 发布:怎么在电脑上切换网络 编辑:程序博客网 时间:2024/05/21 17:45

队列(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;}