/*
队列:一种先进先出的线性表,它只允许在表的一端插入元素,另一端
删除元素,其中插入元素的一端叫做队尾,删除元素的一端叫做对头。

静态队列——使用一维数组储存队列中的元素,一个指针(front)指向
队头,一个指针(rear)指向队尾。
使用的数组必须是循环数组
*/

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

#define LEN 6 // 定义队列长度

// 说明:此循环队列使用空出一个位置的方法解决队列空与满的问题
typedef struct QUEUE
{
int * pBase; // 用于作为循环数组
int front; // 用于标记队列头
int rare; // 用于标记列尾
}Queue, * pQ;

// 创建一个静态队列
void Create_Queue(pQ queue, int len);
// 静态队列初始化
void Init_Queue(pQ queue);
// 遍历整个队列
void Travel_Queue(pQ queue);
// 判断队列是否满
bool Is_Full(pQ queue);
// 判断队列是否为空
bool Is_Empty(pQ queue);
// 入队
void En_Queue(pQ queue, int val);
// 出队,并将出队的数据返还给主函数
void Out_Queue(pQ queue, int * val);
// 在队列中查找某元素,并返回该位置
int Search_InQueue(pQ queue, int val);
// 计算此时队列长度
int Length_Queue(pQ queue);
// 销毁整个队列
void Destory_Queue(pQ queue);

int main(void)
{
Queue queue;
Create_Queue(&queue, LEN);
Init_Queue(&queue);
En_Queue(&queue, 1);
En_Queue(&queue, 2);
En_Queue(&queue, 3);
En_Queue(&queue, 4);
Travel_Queue(&queue);

int len = Length_Queue(&queue);
printf("队列长度为:%d\n", len);

int val;
Out_Queue(&queue, &val);
printf("出队的元素是:%d\n", val);

Search_InQueue(&queue, 5);

Destory_Queue(&queue);

return 0;
}

void Create_Queue(pQ queue, int len)
{
queue->pBase = (int *)malloc(len * (sizeof(int)));
if (NULL == queue->pBase)
{
printf("动态内存分配失败!\n");
exit(-1);
}

return;
}

void Init_Queue(pQ queue)
{
queue->front = 0;
queue->rare = 0;

return;
}

void Travel_Queue(pQ queue)
{
int pos;
for (pos = queue->front; pos != queue->rare; pos = (pos+1) % LEN)
{
printf("%-5d", queue->pBase[pos]);
}
printf("\n");

return;
}

bool Is_Full(pQ queue)
{
if ( (queue->rare + 1) % LEN == queue->front )
return true;
else
return false;
}

bool Is_Empty(pQ queue)
{
if (queue->front == queue->rare)
return true;
else
return false;
}

void En_Queue(pQ queue, int val)
{
if ( Is_Full(queue) )
{
printf("该队列已满!\n");
exit(-1);
}
queue->pBase[queue->rare] = val;
queue->rare = (queue->rare + 1) % LEN;

return;
}

void Out_Queue(pQ queue, int * val)
{
if ( Is_Empty(queue) )
{
printf("该队列为空!\n");
exit(-1);
}
*val = queue->pBase[queue->front];
queue->front = (queue->front + 1) % LEN;

return;
}

int Search_InQueue(pQ queue, int val)
{
int pos;
for (pos = queue->front; pos != queue->rare; pos = (pos+1) % LEN)
{
if (queue->pBase[pos] == val)
{
return pos;
}
}
printf("该元素不在此队列!\n");

return -1;
}

int Length_Queue(pQ queue)
{
int pos, cnt = 0;
for (pos = queue->front; pos != queue->rare; pos = (pos+1) % LEN)
{
++cnt;
}

return cnt;
}

void Destory_Queue(pQ queue)
{
free(queue->pBase);
queue->pBase = NULL;

return;
}

 

转载请注明出处