隊列
定義:一種可以實現先進先出的存儲結構
分類:
靜態隊列 數組實現 一般用循環隊列
需要兩個參數 front rear (指向最後一個元素的下一位)
鏈式隊列
隊列的具體應用:
所有和時間有關的操作都與隊列有關
# include <stdio.h>
# include <malloc.h>
typedef struct Queue //循環隊列使用的是數組實現所以通過結構體來構造一個數組
{
int * pBase;
int front;
int rear;
}QUEUE;
void init(QUEUE *); //對隊列進行初始化,將所需要的數組動態分配出來
bool en_queue(QUEUE *, int val); //入隊函數
void traverse_queue(QUEUE *); // 將隊列進行輸出
bool full_queue(QUEUE *); // 判斷對列是否爲滿
bool out_queue(QUEUE *, int *); // 出隊函數
bool emput_queue(QUEUE *); // 判斷隊列是否爲空
int main(void)
{
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);
en_queue(&Q, 8);
traverse_queue(&Q);
if ( out_queue(&Q, &val) )
{
printf("出隊成功,隊列出隊的元素是: %d\n", val);
}
else
{
printf("出隊失敗!\n");
}
traverse_queue(&Q);
return 0;
}
void init(QUEUE *pQ)
{
pQ->pBase = (int *)malloc(sizeof(int) * 6); //動態分配24個字節每4個一組,相當於一個長度爲6的數組
pQ->front = 0; //隊列的前端
pQ->rear = 0; // 隊列的後端
}
bool full_queue(QUEUE * pQ)
{
if ( (pQ->rear + 1) % 6 == pQ->front ) //循環隊列的核心,利用(f+1)%數組個數 來實現循環 因爲r指向隊列中最後一個元素的下一位,r指向的元素無效
return true;
else
return false;
}
bool en_queue(QUEUE * pQ, int val) //入隊
{
if ( full_queue(pQ) ) //首先判斷隊列是否爲滿
{
return false;
}
else
{
pQ->pBase[pQ->rear] = val; //後來入隊的元素放在r的位置上,r向後移動一位
pQ->rear = (pQ->rear+1) % 6;
return true;
}
}
void traverse_queue(QUEUE * pQ)
{
int i = pQ->front;
while (i != pQ->rear)
{
printf("%d ", pQ->pBase[i]);
i = (i+1) % 6;
}
printf("\n");
return;
}
bool emput_queue(QUEUE * pQ)
{
if ( pQ->front == pQ->rear )
return true;
else
return false;
}
bool out_queue(QUEUE * pQ, int * pVal)
{
if ( emput_queue(pQ) )
{
return false;
}
else
{
*pVal = pQ->pBase[pQ->front];
pQ->front = (pQ->front+1) % 6;
return true;
}
}