1. 程式人生 > 實用技巧 >迴圈佇列—陣列實現

迴圈佇列—陣列實現

#include <stdio.h>
#include <stdlib.h>
/********************************/
/******  迴圈佇列的操作  *******/
/******************************/
/* 結構體變數 */
typedef struct Queue
{
	int * p;
	int front;
	int rear;
}QUEUE;


/* 函式宣告 */
void init(QUEUE * );				//迴圈佇列初始化
bool en_queue(QUEUE * , int);		//入隊
bool out_queue(QUEUE * , int * );	//出隊
void traverse_queue(QUEUE * );		//遍歷
bool empty_queue(QUEUE * );			//判斷佇列是否為空
bool full_queue(QUEUE * );			//判斷佇列是否滿
/* 主函式 */
int main()
{
	QUEUE Q;
	int val;

	init(&Q);
	en_queue(&Q, 1);
	en_queue(&Q, 2);
	en_queue(&Q, 3);
	en_queue(&Q, 4);
	en_queue(&Q, 5);
	en_queue(&Q, 6);
	en_queue(&Q, 7);

	printf("入隊後佇列的值分別是:\n");
	traverse_queue(&Q);

	if(out_queue(&Q, &val)) //val用來儲存出隊的值【傳地址】
	{
		printf("\n出隊成功!出隊的值為: %d\n", val);
	}
	else
	{
		printf("\n出隊失敗!\n");
	}

	printf("\n出隊後佇列的值分別是:\n");
	traverse_queue(&Q);


	return 0;
}
/* 函式呼叫 */
/*——————————————————————————————————————————————————————*/
void init(QUEUE * pQ)
{
	pQ->p = (int * )malloc(sizeof(int)*6); //動態構造一個數組,p相當於陣列首地址【即變數名】
	pQ->front = 0; 
	pQ->rear = 0;  //佇列初始化,font和rear的值都是零
}

bool en_queue(QUEUE * pQ, int Val)
{
	if(full_queue(pQ))
	{
		return false;
	}
	else
	{
		pQ->p[pQ->rear] = Val;     //需要入隊的值
		pQ->rear = (pQ->rear+1)%6; //入隊的演算法
		
		return true;
	}
}
/*——————————————————————————————————————————————————————*/

bool full_queue(QUEUE * pQ)
{
	if( ( pQ->rear+1 )%6 == pQ->front ) //if((r+l)% 陣列長度 == f) 則佇列已滿
	{
		return true;
	}
	else
	{
		return false;
	}
}
/*——————————————————————————————————————————————————————*/

void traverse_queue(QUEUE * pQ)
{
	int i = pQ->front; //遍歷時不能改變front的指向,因此用另一個變數代替

	while(i != pQ->rear)
	{
		printf("%d ", pQ->p[i]);
		i = (i+1)%6;   //迴圈條件
	}
	printf("\n");

	return;
}
/*——————————————————————————————————————————————————————*/

bool out_queue(QUEUE * pQ, int * pVal)
{
	if(empty_queue(pQ))
	{
		return false;
	}
	else
	{
		*pVal = pQ->p[pQ->front];   //*pVal <==> val【用來儲存出隊的值】
		pQ->front = (pQ->front+1)%6;//出隊的演算法

		return true;
	}
}
/*——————————————————————————————————————————————————————*/

bool empty_queue(QUEUE * pQ)
{
	if(pQ->front == pQ->rear)//如果front與rear的值相等,則該佇列就一定為空
	{
		return true;
	}
	else
	{
		return false;
	}
}
/*——————————————————————————————————————————————————————*/