队列的实现
/*
* 队列
* 说明:该例程为线性表实现,创建一个长度为MaxElements的队列;
* 当头部元素或尾部元素到在线性表的尾部时,下一个元素会返回线性表的头部
*/
# include <stdio.h>
#include <stdlib.h>
#define Error(Str) FatalError(Str);
#define FatalError(Str) fprintf(stderr, "%s\n", Str), exit(1)
typedef int ElementType;
struct QueueRecord;
typedef struct QueueRecord *Queue;
struct QueueRecord
{
int Capacity;
int Front;
int Rear;
int Size;
ElementType *Array;
};
int IsEmpty(Queue Q);
int IsFull(Queue Q);
void MakeEmpty(Queue Q);
Queue CreateQueue(int MaxElements);
static int Succ(int Value, Queue Q);
void Enqueue(ElementType X, Queue Q);
void Outqueue(Queue Q);
void traverse(Queue Q);
/*
* 检测队列是否为空
*/
int IsEmpty(Queue Q)
{
return Q->Size == 0;
}
/*
* 检测队列是否已满
*/
int IsFull(Queue Q)
{
return Q->Size == Q->Capacity;
}
/*
* 构造空队列
*/
void MakeEmpty(Queue Q)
{
Q->Size = 0;
Q->Front = 1;
Q->Rear = 0;
}
/*
* 创建一个队列
*/
Queue CreateQueue(int MaxElements)
{
Queue Q;
Q = malloc(sizeof(struct QueueRecord));
if(Q == NULL)
FatalError("空间分配失败!!!");
Q->Array = malloc(sizeof(ElementType) * MaxElements);
if(Q->Array == NULL)
FatalError("空间分配失败!!!");
Q->Capacity = MaxElements;
MakeEmpty(Q);
return Q;
}
static int Succ(int Value, Queue Q)
{
if(++Value == Q->Capacity)
Value = 0;
return Value;
}
/*
* 入队
*/
void Enqueue(ElementType X, Queue Q)
{
if(IsFull(Q))
{
Error("队列已满,无法入队,皮卡!!!");
}
else
{
Q->Size++;
Q->Rear = Succ(Q->Rear, Q);
Q->Array[Q->Rear] = X;
}
}
/*
* 出队
*/
void Outqueue(Queue Q)
{
if(IsEmpty(Q))
{
Error("队列为空,无法执行出队操作,皮卡!!!");
}
else
{
Q->Size--;
Q->Front = Succ(Q->Front, Q);
}
}
/*
* 队列遍历
*/
void traverse(Queue Q)
{
int i,key = 1,j;
if(0 == Q->Size)
printf("(+﹏+),我的神啊,这个队列竟然是空的\n");
else
{
for(j=0; j<Q->Size; j++)
{
i = Q->Front + j;
if(i >= Q->Capacity)
i -= Q->Capacity;
printf("节点%d:%d\n", key,Q->Array[i]);
key++;
}
}
}
void main()
{
//创建一个长度为10个元素的队列
Queue queue;
int MaxElements = 10;//队列的长度
queue = CreateQueue(MaxElements);
printf("初始化成功,皮卡!\n操作说明:\n");
printf("入队:in 12,将12插入到队列,皮卡!\n");
printf("出队:out,将最早入队的元素出队,皮卡!\n");
printf("其它:traverse,遍历整个队列,退出:exit,皮卡!\n");
char oper[10];
ElementType element;
//主循环
while(1)
{
//参数接收
int par_key=1;
while(1)
{
if(1 == par_key)
scanf("%s", &oper);
else if(2 == par_key)
scanf("%d", &element);
else
break;
char c=getchar();
if(c=='\n')
break;
par_key++;
}
if(strcmp(oper , "in") == 0)
{
//入队
Enqueue(element, queue);
printf("%d入队成功,目前的队列为:\n", element);
traverse(queue);
}
else if(strcmp(oper , "out") == 0)
{
//出队
printf("%d出队成功,目前的队列为:\n", queue->Array[queue->Front]);
Outqueue(queue);
traverse(queue);
}
else if(strcmp(oper , "traverse") == 0)
{
//遍历
traverse(queue);
}
else if(strcmp(oper , "exit") == 0)
{
//退出
break;
}
}
}运行结果
[root@iZ28mhfkaunZ queue]# ./queue 初始化成功,皮卡! 操作说明: 入队:in 12,将12插入到队列,皮卡! 出队:out,将最早入队的元素出队,皮卡! 其它:traverse,遍历整个队列,退出:exit,皮卡! in 12 12入队成功,目前的队列为: 节点1:12 in 187332 187332入队成功,目前的队列为: 节点1:12 节点2:187332 out 12出队成功,目前的队列为: 节点1:187332 out 187332出队成功,目前的队列为: (+﹏+),我的神啊,这个队列竟然是空的 exit
1