队列之顺序队列与循环队列 顺序循环队列q 0 m 1
二、队列的分类 队列本身也是一种线性表,因而和线性表一样也有顺序和链式存储结构两种存储方式。 采用顺序存储结构实现的队列称为顺序队列; 采用链式存储结构实现的队列称为链队列。
三、顺序队列1、顺序队列的表示①顺序队列用一个向量空间(一般使用一维数组)来存放当前队列中的元素。
②由于队列的队头和队尾的位置是变化的,设置两个指针front和rear分别指示队头元素和队尾元素在向量空间中的位置,它们的初值在队列初始化时均应置为0。
2、 顺序队列的基本操作
①入队时:将新元素插入rear所指的位置,然后将rear加1。
②出队时:删去front所指的元素,然后将front加1并返回被删元素。
注意:
①当头尾指针相等时,队列为空。
②在非空队列里,队头指针始终指向队头元素,尾指针始终指向队尾元素的下一位置。3、顺序队列中的溢出现象 ① "下溢"现象
当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。
② "真上溢"现象
当队列满时,做进栈运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。
③ "假上溢"现象
由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空间的规模时,也可能由于尾指针已超越向量空间的上界而不能做入队操作。该现象称为"假上溢"现象。
四、循环队列为充分利用向量空间,克服"假上溢"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(CircularQueue)。
1、 循环队列的基本操作
循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。只不过当头尾指针指向向量上界(QueueSize-1)时,其加1操作的结果是指向向量的下界0。这种循环意义下的加1操作可以描述为:
① 方法一:
if(i+1==QueueSize) //i表示front或rear
i=0;
else
i++;
② 方法二--利用"模运算"
i=(i+1)%QueueSize;
2、 循环队列边界条件处理
循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front==rear来判别队列是"空"还是"满"。
解[]决这个问题的方法至少有三种:
① 另设一布尔变量以区别队列的空和满;
② 少用一个元素的空间。约定入队前,测试尾指针在循环意义下加1后是否等于头指针,若相等则认为队满(注意:rear所指的单元始终为空);
③使用一个计数器记录队列中元素的总数(即队列长度)。
3、程序#define DataType int#define MAXSIZE 100
using namespace std;
typedef struct_CirQueue{DataType data[MAXSIZE];int front; //头指针,队非空时指向队头元素int rear; //尾指针,队非空时指向队尾元素的下一位置}CirQueue, *pCirQueue;
void InitQueue(pCirQueue pQueue);bool Empty(pCirQueuepQueue);bool InsertQueue(pCirQueue pQueue, DataType x);DataType OutQueue(pCirQueue pQueue);DataType GetHead(pCirQueuepQueue);int GetLength(pCirQueue pQueue);
int _tmain(int argc, _TCHAR* argv[]){int len = 0, data;CirQueue myQueue;InitQueue(&myQueue);if (!Empty(&myQueue)){printf("Queue is Empty");}InsertQueue(&myQueue, 1);InsertQueue(&myQueue, 2);InsertQueue(&myQueue, 3);InsertQueue(&myQueue, 4);len = GetLength(&myQueue);data = GetHead(&myQueue);while (Empty(&myQueue)){data = OutQueue(&myQueue);cout<<endl<<data;}return 0;}
//初始化:初始化一个新的队列void InitQueue(pCirQueue pQueue){memset(pQueue, 0, sizeof(CirQueue));}
//队列非空判断:若队列不为空,则返回true;否则返回false。bool Empty(pCirQueuepQueue){if (pQueue->front !=pQueue->rear){return true;}else return false;}
//入队列:在队列的尾部插入元素x,使元素x成为新的队尾。若 队列满,则返回false;否则,返回true。bool InsertQueue(pCirQueue pQueue, DataType x){if ((pQueue->rear+1)%MAXSIZE !=pQueue->front) //判断队列是否已满{pQueue->data[pQueue->rear] =x;pQueue->rear = (pQueue->rear +1)%MAXSIZE;return true;}elsereturn false;}
//出队列:若队列不为空,则返回对头元素,并从对头删除该元素,对头指针指向原对头的后记元素;否则,返回元素NULLDataType OutQueue(pCirQueue pQueue){DataType data;if (pQueue->front ==pQueue->rear){return NULL;}else{data =pQueue->data[pQueue->front];pQueue->front = (pQueue->front +1)%MAXSIZE;return data;}}
//取对头元素:若队列不空,则返回对头元素;否则,返回空元素NULLDataType GetHead(pCirQueue pQueue){if (pQueue->front ==pQueue->rear){return NULL;}else{returnpQueue->data[pQueue->front];}}
//求队列长度int GetLength(pCirQueue pQueue){int length = 0, number = 0;for (number = pQueue->front; number%MAXSIZE< pQueue->rear; number =(number+1)%MAXSIZE){length++;}return length;}
运行结果:
更多阅读
中国古代民间四大爱情传说之梁山伯与祝英台 梁山伯与祝英台动画片
中国古代民间四大爱情传说之梁山伯与祝英台关于《梁祝》传说,我和大多数国人一样,从耳闻一刻起便印象深刻。尤其是中学时代偶然的一个机会看到动漫电影版的《梁山伯与祝英台》,总是不禁浮想起该片种种经典镜头与人物场景,特别是咳血不
第三届华东六省一市小学语文教学观摩研讨活动《天火之谜》与《诺 幼儿园年级观摩研讨
第三届华东六省一市小学语文教学观摩研讨活动《天火之谜》与《诺贝尔》整合课堂实录执教:钱煜华(江苏省镇江市丹阳市实验小学)实录:吴文勤、洪艳艳(安徽省黄山市屯溪区龙山实验小学)一、课前谈话(板书课题)1.师:刚才美丽的主持老师讲了我们
小学奥数专题讲解之方阵问题与练习
小学奥数专题讲解之方阵问题与练习http://blog.sina.com.cn/s/blog_4a6685e90102vw3z.html方阵其实是一种队形,一个团队排队,横着排叫行,竖着排叫列,若行数与列数都相等,正好排成一个正方形,这种队形就叫做方阵。将一些物体按照这样
执子之手,与子偕老 执子之手与子偕老意思
一直很喜欢这样的一句话,"执子之手,与子偕老。"那是种淡淡的感觉,淡淡的爱情,没有太多的轰轰烈烈惊天动地,有的是象流水一样绵延不断的感觉;没有太多的海誓山盟花前月下,是相对无言眼波如流的默契......"执子之手,与子偕老。"这该是一种并肩
简评电视剧《贞观之治》与《贞观长歌》 贞观之治电视剧下载
简评电视剧《贞观之治》与《贞观长歌》期待已久的电视剧《贞观长歌》终于在央视一套首播。现在正值寒假,我也可无课业压力之忧,在家中慢慢品味贞观之风,以弥补没有完整看《贞观之治》的遗憾。也许是我期望太高,也或许是我对唐初贞观一