/*
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;
}
數據結構學習之_循環隊列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.