1. 程式人生 > >順序迴圈佇列的基本運算(C語言)

順序迴圈佇列的基本運算(C語言)

迴圈佇列sq中:

 1. front(隊頭指標)指向實際佇列元素的第一個元素的前一個位置,rear(隊尾指標)指向實際佇列元素的最後一個元素位置。(可根據需要自定義) 2. 迴圈佇列中的滿並非真正意義上的滿,即並不是所有的位置上都儲存有元素,而是front和rear之間仍然隔著一個空位。若不隔此空位,當sq->rear == sq->front時,是滿?還是空?。 3. 初始時:sq->front = sq->rear = 0;(初始化)     隊空條件:sq->front == sq->rear;(判空)     隊滿條件:(sq->rear+1)%MaxLen == sq->front;(判滿)

完整程式碼如下:

//queue.cpp - 順序迴圈佇列的基本運算  

#include <iostream>
#define MaxLen 20

//順序佇列的節點型別定義
typedef char ElementType;
typedef struct queue
{
	ElementType data[MaxLen];         //順序佇列的儲存方式 - 一維陣列 
	int front, rear;                  //front - 頭指標、rear - 尾指標 
} queue;

//基本運算
void InitQueue(queue *sq);       //初始化佇列

bool EnQueue(queue *sq, ElementType x);       //入佇列

bool OutQueue(queue *sq, ElementType &x);     //出佇列 

bool IsEmpty(queue *sq);                //判空

bool IsFull(queue *sq);                //判滿


//具體實現
//初始化佇列 
void InitQueue(queue *sq)
{
	sq->front = 0;
	sq->rear = 0;
}

//判空
bool IsEmpty(queue *sq)
{
	if(sq->front == sq->rear)          //佇列為空 
      return true;
    else
      return false;
} 

//判滿 - 這裡的滿不是真正意義上的滿,最滿的情況時,front和rear之間還隔有一個空位 
bool IsFull(queue *sq)
{
	if( (sq->rear+1)%MaxLen == sq->front )     //佇列上溢位 
	  return true;
	else
	  return false; 
} 

//入佇列
bool EnQueue(queue *sq, ElementType x)
{
	if( IsFull(sq) )          //佇列已滿,無法再入佇列 
	  return false;
	else
	{
		sq->rear = (sq->rear+1) % MaxLen;
		sq->data[sq->rear] = x;
		return true;
	}
} 

//出佇列
bool OutQueue(queue *sq, ElementType &x)
{
	if( IsEmpty(sq) )             //佇列為空,無法出佇列 
	  return false;
	else
	{
		sq->front = (sq->front+1) % MaxLen;
		x = sq->data[sq->front];
		return true;
	} 
}