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

迴圈佇列優化版—陣列實現

/********************************/
/***  迴圈佇列的操作優化版   ***/
/******************************/
#include <stdio.h>
#include <stdlib.h>

#define Maxsize 5    //陣列最多5個元素 

typedef struct Queue
{
	int * p;  //維護一維陣列,陣列名
	int front;//第一個元素的下標
	int rear; //尾部元素的後一個元素的下標
}Queue;


/* 函式宣告 */
void test01();
void InitQueue(Queue * );		//1. 迴圈佇列初始化
void EnQueue(Queue * , int);		//2. 入隊
void TraverseQueue(Queue * );		//3. 遍歷
void OutQueue(Queue * , int * );	//4. 出隊
int main()
{
	test01();
	
	system("pause"); 
	return 0;
}
void test01()
{
	int n, m, e;
	Queue Q;
	
	InitQueue(&Q);

	printf("請輸入元素的個數:\n");
	scanf("%d", &n);
	printf("依次輸入元素:\n");
	while(n--)
	{
		scanf("%d", &m);
		EnQueue(&Q, m);
	}
	
	printf("遍歷元素:\n");
	TraverseQueue(&Q);

	printf("元素依次出隊:\n");
	while(Q.rear != Q.front)
	{
		OutQueue(&Q, &e);
		printf("%d ", e);
	}
	
	printf("\n");
}
//1. 迴圈佇列初始化
void InitQueue(Queue * q)
{
	q->p = (int * )malloc(sizeof(int) * Maxsize); //動態構造一個數組,p相當於陣列首地址【即變數名】
	
	//佇列初始化,font和rear的值都是零
	q->front = 0; 
	q->rear = 0; 
}

//2. 入隊
void EnQueue(Queue * q, int val)
{
	if(( q->rear+1 ) % Maxsize == q->front)//佇列滿
	{
		return;
	}
	
	q->p[q->rear] = val;     //需要入隊的值
	q->rear = (q->rear+1) % Maxsize; //下標後移一位 
}

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

	while(i != q->rear)
	{
		printf("%d ", q->p[i]);
		i = (i+1) % Maxsize; //下標後移一位 
	}
	printf("\n");
}

//4. 出隊
void OutQueue(Queue * q, int * val)
{
	if(q->front == q->rear)//佇列為空
	{
		return;
	}
	
	*val = q->p[q->front];   //*val <==> e【用來儲存出隊的值】
	q->front = (q->front+1) % Maxsize;//下標後移一位 
}