數據結構學習之_循環隊列

/*
	2013年3月26日 21:40:14 xulei
	隊列: 滿足先進先出的序列.
	通常可分爲: 鏈式隊列(內部是鏈表), 靜態隊列(內部是數組)
	隊列的第一個節點: 隊頭(front), 允許刪除(出隊), 指向第一個有效節點.
	隊列的最後一個節點: 隊尾(rear), 允許插入(入隊), 指向最後一個有效節點的下一個節點.
	靜態隊列通常都必須是循環隊列.
	循環隊列的操作: 如一個10個元素的數組進行循環隊列的操作.
	1. 入隊, 將新元素放在rear的位置, rear位置加1, 若越界則回到第一個元素位置(rear = (rear + 1)%(數組長度)
	2. 出隊, front 加1, 若越界則回到第一個元素位置(front = (front + 1)%(數組長度)
	3. 判斷爲空: front == rear 時爲空.
	4. 判斷爲滿: (rear + 1)%(數組長度) == front 時爲滿.
*/

#include <stdio.h>
#include <malloc.h>

struct queue
{
	int *base;	// 指向一個數組(假設爲一個整形數組)
	int front;
	int rear;
};

// 初始化
int init_queue(struct queue *q)
{
	q->base = (int *)malloc(sizeof(int)*10);	// 假設爲10個整形元素的數組
	if(q->base == NULL)
	{
		printf("初始化分配內存失敗, 退出!\n");
		return -1;
	}
	q->front = q->rear = 0;	// rear 和 front 都指向第一個元素.
	return 0;
}

// 判斷是否已滿, 滿返回1, 不滿返回0;
int is_full(struct queue *q)
{
	if((q->rear + 1)%10 == q->front )
		return 1;
	else
		return 0;
}

// 判斷是否爲空
int is_empty(struct queue *q)
{
	if(q->rear == q->front)
		return 1;
	else
		return 0;
}

// 入隊, 爲空返回1, 不空返回0
int en_queue(struct queue *q, int val)
{
	if(is_full(q))
	{
		printf("隊列已滿, 入隊失敗!\n");
		return -1;
	}
	q->base[q->rear] = val;
	q->rear = (q->rear + 1)%10;
	return 0;
}

// 出隊
int del_queue(struct queue *q)
{
	if(is_empty(q))
	{
		printf("隊列爲空, 出隊失敗!\n");
		return -1;
	}
	q->front = (q->front + 1)%10;
	return 0;
}

// 打印出所有元素
int show_queue(struct queue *q)
{
	int i = q->front;
	while(i != q->rear)
	{
		printf("%d ", q->base[i]);
		i = (i+1)%10;		
	}
	printf("\n");
	return 0;
}

int main(int argc, char **argv)
{
	struct queue q;
	init_queue(&q);
	del_queue(&q);
	show_queue(&q);
	en_queue(&q, 100);
	en_queue(&q, 82);
	en_queue(&q, 74);
	en_queue(&q, 79);
	en_queue(&q, 87);
	en_queue(&q, 82);
	en_queue(&q, 54);
	en_queue(&q, 77);
	show_queue(&q);
	en_queue(&q, 94);
	en_queue(&q, 41);
	en_queue(&q, 41);
	show_queue(&q);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章