[数据结构] 队列的循环数组实现

来源:互联网 发布:matlab table转为矩阵 编辑:程序博客网 时间:2024/05/22 14:25

当用数组表示队列时,可以把数组看成是一个环形,即令数组中第一个单元紧跟在其最后一个单元之后。

当要插入一个新元素时,只需将指针Q->rear沿顺时针移动一个位置,然后把元素放入Q->rear所指的单元中;当要删除队列中的一个元素时,只需简单地把指针Q->front沿顺时针移动一个位置即可。因此,如果假定数组的长度为maxlength,则以maxlength为模来移动指针Q->rear和Q->front,即可实现队列上的插入和删除操作,并且执行这些操作所花的时间与队列的长度无关。

为了能够区分空队列和满队列,把Q->rear所指的单元比Q->front所指的单元滞后一个位置(沿顺时针方向)作为空队列状态;而把Q->rear所指的单元比Q->front所指的单元滞后两个位置(沿顺时针方向)作为满队列状态。

#include <iostream>using namespace std;#define maxlength 100typedef int element_type;typedef struct QUEUE{int front;int rear;element_type elements[maxlength];};int addone( int i )//将i的位置按模加1 {return ( (i+1) % maxlength );}void MakeNull(QUEUE *Q)//将队列置为空 {Q->front = 0;Q->rear = maxlength - 1;} //MakeNullbool Empty(QUEUE *Q)//测试队列是否为空 {if( addone(Q->rear) == Q->front )  return true;else  return false; }//Emptyelement_type Front(QUEUE *Q)//返回队列Q的第一个元素 {if( Empty(Q) )  cout << "Queue is empty!" << endl;    else      return ( Q->elements[Q->front] );    }void EnQueue(element_type x,QUEUE *Q)//将元素x插入到队列Q的后端 {if( addone( addone(Q->rear) ) == Q->front )  cout << "Queue is full!" << endl;    else    {    Q->rear = addone(Q->rear);    Q->elements[Q->rear] = x;    }} //EnQueuevoid DeQueue(QUEUE *Q)//删除队列Q的第一个元素 {if( Empty(Q) )  cout << "Queue is empty!" << endl;    else      Q->front = addone(Q->front);}int main(){QUEUE *Q;    int m,n;MakeNull(Q); EnQueue(1,Q);    EnQueue(2,Q);m = Front(Q);cout << m << endl;DeQueue(Q);n = Front(Q);cout << n << endl;return 0;}

0 0
原创粉丝点击