顺序循环队列的入队、出队、遍历操作
#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define MAX_SIZE 30
/* 循环队列-顺序式实现 */
/*
队列先进先出,
限定插入只能在队尾进行,删除只能在队首进行。
*/
typedef struct{
char element[ MAX_SIZE ];
int front; //指向队首元素位置
int rear; //队列不为空时指向队尾元素的下一位置
}SeqQueue;
void InitQueue(SeqQueue *Q)
{
Q->front =0;
Q->rear = 0;
}
int IsEmpty(SeqQueue Q)
{
//判断队空的条件,Q->front 是否等于 Q->rear
if ( Q.front == Q.rear )
{
return TURE;
}
else
{
return FALSE;
}
}
int EnQueue(SeqQueue *Q, char x)
{
//判定队满的条件,牺牲一个元素空间,Q->rear+1 是否等于 Q->front
if ( ( Q->rear+1 ) % MAX_SIZE == Q->front )
return FALSE;
//将元素x赋值到队尾位置
Q->element[ Q->rear ] = x;
//rear队尾标志向后移一位置
Q->rear = ( Q->rear+1 ) % MAX_SIZE;
return TURE;
}
int DeQueue(SeqQueue *Q, char *x)
{
if ( Q->front == Q->rear )
return FALSE;
*x = Q->element[ Q->front ];
Q->front = ( Q->front+1 ) % MAX_SIZE;
return TURE;
}
//若队列不空,则用x返回队头元素
int GetHead(SeqQueue Q, char *x)
{
if ( Q.front == Q.rear )
return FALSE;
*x = Q.element[ Q.front ];
return TURE;
}
//清空队列
void ClearQueue(SeqQueue *Q)
{
Q->front = Q->rear = 0;
}
//队列元素个数,画图理解
int QueueLen(SeqQueue Q)
{
return (Q.rear - Q.front + MAX_SIZE) % MAX_SIZE;
}
//遍历队列元素
void TraverseQueue(SeqQueue Q)
{
int i;
i = Q.front;
while ( i != Q.rear )
{
printf("%c ", Q.element[i]);
i = ( i + 1 ) % MAX_SIZE;
}
printf("\n");
}
int main()
{
int i, t, flag=1;
char x;
SeqQueue Q;
//队列初始化
InitQueue( &Q );
printf("26字母入队!\n");
for(i=1; i<=26; i++)
{
flag = EnQueue(&Q, i+'a'-1);
if ( !flag )
{
printf("插入到 %c 时失败,请检查!\n", i+'a'-1);
break;
}
}
/*判断为空的这一步可以去掉*/
printf("\n队列是否为空:");
flag = IsEmpty( Q );
if ( flag )
{
printf("空!\n");
}
else
{
printf("非空!\n");
}
printf("\n遍历队列元素:\n");
TraverseQueue( Q );
printf("\n队列元素个数:");
t = QueueLen( Q );
printf("%d\n", t);
printf("\n----------------");
printf("\n\n查看队头元素:");
flag = GetHead(Q, &x);
if ( flag )
{
printf("%c\n", x);
}
else
{
printf("查看队头元素失败!\n");
}
printf("\n遍历队列元素:\n");
TraverseQueue( Q );
printf("\n----------------");
printf("\n\n队头元素出队!\n");
flag = DeQueue(&Q, &x);
if ( flag )
{
printf("\n出队成功!\n");
}
else
{
printf("\n出队失败!\n");
}
printf("\n遍历队列元素:\n");
TraverseQueue( Q );
printf("\n队列元素个数:");
t = QueueLen( Q );
printf("%d\n", t);
}