**
C語言隊列入門程序舉例
**
程序功能
創建一個7個數據的循環隊列,創建完成後立即返回排頭和隊尾元素指針,並返回隊中元素,然後將倒數三個元素退隊,退隊後返回退隊元素是什麼,然後再返回隊中元素和現在的排頭和隊尾指針。
源代碼
main.h
#include <stdio.h>
#include <math.h>
#include "Queue.h"
//函數聲明
void InitQueue(Queue *Q);
void EnQueue(Queue *Q, int key);
int DeQueue(Queue *Q);
int IsQueueEmpty(Queue *Q);
int IsQueueFull(Queue *Q);
Queue.h
#include <stdio.h>
#include <stdlib.h>
typedef struct queue
{
int queuesize; //數組的大小
int head, tail; //隊列的頭和尾下標
int *q; //數組頭指針
}Queue;
main.c
#include "main.h"
void main()
{
Queue example1,example2,*Q,*X;
int i,key,size,*h,*t;
Q=&example1;
X=&example2;
InitQueue(Q);
InitQueue(X);
printf("請輸入七個整數\n");
for(i=0;i<7;i++)
{
scanf("%d",&key);
EnQueue(Q,key);
}
//遍歷隊列
h=&Q->q[Q->head];
t=&Q->q[Q->tail-1];
size=(int)(fabs((double)((Q->tail)-(Q->head)))); //隊列中現有的元素個數
printf("輸入完成\n您創建的隊列的排頭指針爲\n%d\n隊尾指針爲\n%d\n隊中各元素分別爲\n",h,t);
if(size==0)
printf("隊列爲空\n");
else
for(i=0;i<size;i++)
printf("%d\t",Q->q[(Q->head+i)%(Q->queuesize)]);
//寄存其餘元素
InitQueue(X);
for(i=0;i<size-3;i++)
EnQueue(X,DeQueue(Q));
for(i=3;i>0;i--)
printf("\n退隊的倒數第%d個元素爲\n%d\n",i,DeQueue(Q));
//恢復原隊列剩餘元素
for(i=0;i<size-3;i++)
EnQueue(Q,DeQueue(X));
//遍歷剩餘元素並輸出頭尾指針
h=&Q->q[Q->head];
t=&Q->q[Q->tail-1];
size=(int)(fabs((double)((Q->tail)-(Q->head)))); //隊列中現有的元素個數
printf("此時隊列的排頭指針爲\n%d\n隊尾指針爲\n%d\n隊中剩餘各元素分別爲\n",h,t);
if(size==0)
printf("隊列爲空\n");
else
for(i=0;i<size;i++)
printf("%d\t",Q->q[(Q->head+i)%(Q->queuesize)]);
}
Queue.c
void InitQueue(Queue *Q)//初始化隊列
{
Q->queuesize = 8;
Q->q = (int *)malloc(sizeof(int) * Q->queuesize); //分配內存
Q->tail = 0;
Q->head = 0;
}
void EnQueue(Queue *Q, int key)//入隊
{
int tail = (Q->tail+1) % Q->queuesize; //取餘保證,當quil=queuesize-1時,再轉回0
if (tail == Q->head) //此時隊列沒有空間
{
printf("隊列已滿\n");
}
else
{
Q->q[Q->tail] = key;
Q->tail = tail;
}
}
int DeQueue(Queue *Q)//退隊
{
int tmp;
if(Q->tail == Q->head) //判斷隊列不爲空
{
tmp=0;
printf("隊列爲空\n");
}
else
{
tmp = Q->q[Q->head];
Q->head = (Q->head+1) % Q->queuesize;
}
return tmp;
}
int IsQueueEmpty(Queue *Q)//判斷隊列是否爲空
{
if(Q->head == Q->tail)
{
printf("隊列爲空\n");
return 0;
}
else
{
printf("隊列不爲空\n");
return 0;
}
}
int IsQueueFull(Queue *Q)//判斷隊列是否爲滿
{
if((Q->tail+1)% Q->queuesize == Q->head)
{
printf("隊列已滿\n");
return 0;
}
else
{
printf("隊列未滿\n");
return 0;
}
}