首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

基于数组的循环行列

2013-01-27 
基于数组的循环队列之前讲的是基于链式存储的队列,如果是基于数组的存储结构 的队列会是怎样的呢?起初队头

基于数组的循环队列

之前讲的是基于链式存储的队列,如果是基于数组的存储结构 的队列会是怎样的呢?起初队头和队尾均指向第一个元素,随着不断地进队列,后来队列满了。这时候从队头出队列,当出完后此时队头和队尾均指向数组的末尾了。虽然这个数组是空的,但是不能用来存储了,造成了很大的浪费。在这个时候能不能将数组前面的空位置利用起来,继续用来存储呢?这个时候就用到了循环队列的概念了,循环队列主要是为了解决基于顺序存储的队列造成的大量空间浪费问题,这时候一个数组被看成了一环,这样子之前的情况下队尾值可以继续进元素的,把空间利用起来了。

将一个数组看成是一个环用到了取模运算,如(rear + 1)%maxSize; (front + 1)%maxSize等式子。基于数组的存储结构一般有静态开辟空间和动态开辟空间,这里使用静态开辟方式。链式存储的队列有空队列概念没有满队列概念,可是这里的循环队列是有空队列和满队列概念的。空队列的时候就是队头指针和队尾指针重合,可是队列满怎么判断呢?在这里为了简便判断牺牲了一个数组元素空间,当(rear + 1)%maxSize == front成立的时候就是循环队列满的时候,也就是说当队尾和队头空一个位置的时候就是队列满的情况了。

由于将数组处理成了一个环状结构了,所以这个时候队列的头与尾也就不那么重要了,一般情况下默认为空队列队头和队尾同时指向数组的第一个位置。为了易于扩展和方便使用,这里采取了事先指定队头和队尾的方式,当然可以是默认的。队头指向队列的第一个真实存在的元素,队尾指针指向的是队列中实际最后一个元素的下一个位置。这里和STL的容器是一个道理,都是左闭右开区间。

#include"Queue.h"#include<iostream>using namespace std;void main(){Queue<int> qu;for(int i=0;i<5;i++)qu.InQueue(i);qu.output();Queue<int> qu1;qu1 = qu;qu1.output();}

热点排行