C++数据结构之队列queue
什么是队列
队列的基本特征
队列是如何工作的
队列的实现
队列的应用
什么是队列
与栈相反,队列是一种先进先出(FIFO)的线性表,只允许在表的一端插入,在另一端删除。允许插入的一端叫队尾,允许删除 的一端叫队头。比较典型的例子有日常生活中的排队:银行排序办理业务、地铁排队上车(emmmm,这里假设所有人都遵守秩序)等,当然还有计算机系统的消息队列,操作系统的作业调度(这两者都可以看做是队列,不过是队列的高级应用:优先级队列)等
队列的基本特征
- 先进先出(FIFO)
- 限制插入和删除:队尾(back)插入,队头(front)删除
队列是如何工作的
如下图所示:
front代表队头,back代表队尾,初始状态,front与back指向同一位置,当插入一个新元素a后,队尾back向后移动一位,队头front不动,指向下一个位置,当在a的下一个位置插入元素b时,队尾back继续向后移动一位,直到满队列,此时back指向最后的位置。当删除一个元素时,队头front向后移动一位,队尾back不动。在这种队列结构下,可以通过(front == back)来判断队列是否为空。
队列的实现
队列的实现主要有两种方式:顺序表和链表;队列的操作主要有:取出队头元素(front())、
删除队头元素(pop())、队尾插入元素(push())、是否为空(Empty())、队列元素数(size())
、是否已满(Full())
顺序表实现队列
顺序表的实现较为简单,直接使用数据存储数据即可,而front和back代表数组的下标(索引),
这样做的缺点就是队列的长度固定,同时由于每次删除元素时,队头向后移动一位,当队列中所有
元素被删除时,此时front ==back,但是,此时继续向队列中插入元素时,就会出现数组越界的
情况。
如上所示,此时,front与back都以指向了最后位置,无法继续在队列中插入数,但是,
front前面的空间仍旧是空的,没有存储内容,此时如果采用动态内存分配无疑会浪费内
存空间,因此,为了能够充分利用已分配的数组空间,可以将数组想象为一个首尾相
接的环,循环存储数据,称之为循环队列。
如上,将数组想象成环状,初始时,front与back都指向起始位置,当有元素插入或者删除时,
进行相应的移动,直到