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

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

当要插入一个新元素时,只需将指针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 100
typedef 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;
} //MakeNull

bool Empty(QUEUE *Q)//测试队列是否为空 
{
	if( addone(Q->rear) == Q->front )
	  return true;
	else
	  return false; 
}//Empty

element_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;
    }
} //EnQueue

void 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;
}

你可能感兴趣的:(队列,指针)