队列是一种先进先出的线性表
针对队列 有初始化队列,入队,出队等关键操作。
入队时要注意队列是否已满,出队时要注意队列是否已空。
为了节约队列实际可用空间,不造成空间浪费,我们可以将顺序队列造成一个环状的空间,即循环队列。
#include<stdio.h>
#include<stdlib.h>
typedef struct BIQueue
{
int* elements;
int size;
int head;
int tail;
}*BQPtr;
//初始化队列
BQPtr initializeBQueue(int paraSize)
{
//printf("Begin to initializeBQueue\r\n");
BQPtr resultBQ = (BQPtr)malloc(sizeof(struct BIQueue));
resultBQ->size = paraSize;
resultBQ->elements = (int*)malloc(paraSize*sizeof(int));
resultBQ->head = 0;
resultBQ->tail = 0;
//printf("end of initializeBQueue\r\n");
return resultBQ;
}
//入队
int enqueue(BQPtr paraQueue, int paraElement)
{
//printf("Begin of enqueue\n");
if ((paraQueue->tail + 1) % paraQueue->size == paraQueue->head) //判断循环队列是否已满
{
printf("%d %d\n", paraQueue->head, paraQueue->tail);
printf("Queue full.");
return -1;
}//Of if
paraQueue->tail++;
paraQueue->elements[(paraQueue->tail - 1) % paraQueue->size] = paraElement;
return 0;
}
//出队
int dequeue(BQPtr paraQueue)
{
if (paraQueue->tail == paraQueue->head)
{
printf("Null queue");
return NULL;
}
paraQueue->head++;
return paraQueue->elements[paraQueue->head - 1 % paraQueue->size];
}
void printQueue(BQPtr paraQueue)
{
int i = paraQueue->head;
//printf("%d",i);
while (i != paraQueue->tail)
{
//printf("%d\n",i);
printf("%d ", paraQueue->elements[i]);
i = (i + 1) % paraQueue->size;
}
printf("\n");
}
int main()
{
BQPtr tempQueue = initializeBQueue(6);
//enqueue(tempQueue, 30);
enqueue(tempQueue, 8);
enqueue(tempQueue, 1);
enqueue(tempQueue, 2);
enqueue(tempQueue, 10);
enqueue(tempQueue, 20);
printf("出队元素为:%d\n", dequeue(tempQueue));
printQueue(tempQueue);
return 0;
}