/*
2018/8/9
本程序使用dev++编写,C语言
顺序队列tag使用,标记队满还是队空
重点在定义结构体和新建队列函数
注意区别满队时和空队时的情况分析
注意traverse时队满的情况处理
抛砖引玉,希望读者有所收获
*/
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include "stdbool.h"
#define MAX_SIZE 5
typedef struct Queue{
int data[MAX_SIZE];
int tag;
int rear, front;
}*PQueue,Queue;
//函数声明
PQueue CreateQueue(void); //创建新队列
void QueuePush(PQueue Q, int val); //入队
void QueuePop(PQueue Q, int *val); //出队
void QueueTraverse(PQueue Q); //遍历
int main()
{
PQueue Q = CreateQueue();
int val,i;
QueueTraverse(Q);
QueuePush( Q, 29);
QueuePush( Q, 34);
QueuePush( Q, 25);
QueueTraverse(Q);
QueuePop(Q,&val);
QueueTraverse(Q);
QueuePush( Q, 25);
QueueTraverse(Q);
QueuePop(Q,&val);
QueueTraverse(Q);
printf("\nHello world!!\n");
return;
}
/* 初始化带标志的队列 */
PQueue CreateQueue(void)
{
PQueue Q = (PQueue)malloc(sizeof(Queue));
Q->front = 0;
Q->rear = 0;
Q->tag = 0;
return Q;
}
/*压队列*/
void QueuePush(PQueue Q, int val)
{
if((Q->tag == 1) && (Q->front==Q->rear) ) //判断满
{
printf("队列满队,请处理数据后在入队!\n");return;
}
Q->data[Q->rear] = val;
Q->rear = ++Q->rear % MAX_SIZE;
Q->tag = 1;
return;
}
/*出队列*/
void QueuePop(PQueue Q, int *val)
{
if(Q->tag ==0 && Q->front==Q->rear ) //判断空
{
printf("队列空队,请添加数据后在出队!\n");return;
}
*val = Q->data[Q->front];
printf("开始出队-val=%d!\n",*val);
Q->front = ++Q->front % MAX_SIZE;
Q->tag = 0;
return;
}
/*遍历队列*/
void QueueTraverse(PQueue Q)
{
if(Q->tag == 0 && Q->front==Q->rear) //空队列
{
printf("队列空队,请添加数据后在traverse!\n");return;
}
int front = Q->front;
printf("%d ",Q->data[front]); // 防止front与rear相等时,无法进入下面的循环
front = ++front % MAX_SIZE;
while( front != Q->rear)
{
printf("%d ",Q->data[front]);
front = ++front % MAX_SIZE;
}
printf("\n");
return;
}