列的特点是“先到先办”FIFO(First In First Out),可将队列形象地比作管道
模拟买火车票的队列实现
#include<stdio.h>
#include<stdlib.h>
#define N 100 //最大有多少个
#define datatype char //定义数据类型,定义队列,
struct queue
{
datatype data[N];//存放数据的数组
int front;//允许删除的一端称为队列
int rear;//允许插入的一端就是队尾
};
typedef struct queue QUEUE;//简化struct queue
void initQUEUE(QUEUE *sq);//初始化顺序队列
int isempty(QUEUE *sq);//判断队列是否为空
datatype gethead(QUEUE *sq);//获取队列第一个元素
void enQUEUE(QUEUE *sq, datatype data);//队列入队
datatype deQUEUE(QUEUE *sq);//队列出队
void showQUEUE(QUEUE *sq);
void initQUEUE(QUEUE *sq)
{
sq->front = sq->rear = 0;//实现队列初始化,等价于清空
}
int isempty(QUEUE *sq)
{
if (sq->front == sq->rear)
{
return 1;
}
return 0;
}
datatype gethead(QUEUE *sq)
{
if (sq->front == sq->rear)
{
return -1;
}
return sq->data[sq->front];//返回第一个节点数据
}
void enQUEUE(QUEUE *sq, datatype data)
{
if (sq->rear == N)//n-1个数
{
printf("队列已经满了");
return;
}
sq->data[sq->rear] = data;//入队
sq->rear++;//
}
datatype deQUEUE(QUEUE *sq)//出队
{
if (sq->front == sq->rear)//队头和队尾重合
{
return -1;
}
sq->front++;//删除一个元素,向前移动
return sq->data[sq->front - 1];//返回一个元素,及删除的元素
}
void showQUEUE(QUEUE *sq)
{
if (sq->front == sq->rear)
{
return;
}
else
{
printf("\nfront=%d,rear=%d\n",sq->front,sq->rear);
for (int i = sq->front; i < sq->rear; i++)//打印所有队列元素
{
printf("%c ", sq->data[i]);
}
}
}
int main()
{
QUEUE q1;//创建队列的结构体
initQUEUE(&q1);
char *str = "abcdefg";
char *p = str;
while (*p != '\0')
{
enQUEUE(&q1, *p);
showQUEUE(&q1);
p++;
}
while (isempty(&q1) != 1)//只要队列不为空,一直循环下去
{
printf("\n出队的字符%c", deQUEUE(&q1));
showQUEUE(&q1);
}
system("pause");
return 0;
}