队列
来源:互联网 发布:斯坦福英语软件下载 编辑:程序博客网 时间:2024/05/29 02:32
数据结构期中考试一塌糊涂,下定决心利用这学期剩下不多的时间好好学学了。
先从队列开始吧
1.队列的基本概念
只能在表的一端进行插入操作,只能在表的另一端进行删除操作,这种数据结构称为队列。把允许插入的一端叫队尾(rear),允许删除的一端叫对头(front)。也就是所谓的First In First Out。
队列的实现也有基于数组和指针两种方式。其中基于指针实现,没有任何技术难度,每个节点加上一个指针成员即可,但是在一定程度上消耗了更多的空间。而基于数组的实现,则会出现一个问题,就是随着元素的不断入队列和出队列,可能会导致整体可用的范围在不断缩小,最终导致效率低下,储存不了几个元素。所以就出现了一个循环队列的东东。循环队列,基于数组实现,无论是查找还是插入删除都是最高效的。实现的核心是一个取模的运算操作。
2.循环队列的实现
队列长度:(rear-front+QueneSize)%QueneSize
队空:front==rear
队满:(rear+1)%QueueSize==front
#include<iostream> using namespace std; const int QueueSize=100; class CirQueue { public: CirQueue() //构造函数,置空队列 { front=rear=0; } ~CirQueue(){cout<<"destory";} //析构函数 void EnQueue(int x); //元素x入队 int DeQueue(); //队头元素出队 int GetQueue(); //获取队头元素,不删除队头 bool Empty() //判断队列是否为空 { if(front==rear) return 1; else return 0; } private: int data[QueueSize]; //存放队列的数组 int front,rear; //头指针与尾指针 }; void CirQueue::EnQueue(int x) { if((rear+1)%QueueSize==front) //判断队列是否已满 cout<<"queue is full,can't put "<<x<<" into it"<<endl; else { rear=(rear+1)%QueueSize; //移动尾指针指向下一个空间 data[rear]=x; //元素x入队 } } int CirQueue::DeQueue() //队头元素出栈 { if(Empty()) //判断队列是否为空 cout<<"queue is empty"<<endl; else { front=(front+1)%QueueSize; //移动队头指针指向下一个空间,即被删元素所在位置 return data[front]; //返回被删除的元素的值 } } int CirQueue::GetQueue() { if(Empty()) cout<<"queue is empty"<<endl; else { return data[(front+1)%QueueSize]; } } int main() { CirQueue Q; Q.EnQueue(5); Q.EnQueue(9); Q.EnQueue(7); cout<<Q.DeQueue()<<endl; cout<<Q.GetQueue()<<endl; cout<<Q.DeQueue()<<endl; cout<<Q.DeQueue()<<endl; Q.DeQueue(); return 0; }这里队列储存是int,是便于实现。可以存储其他任意类型的数据结构。
0 0