项目原因,需要写一个队列来存储串口实时输出的字符串。看了网上很多博文和一些数据结构的数据,给的例子都是实现对单个数字或者字符的队列操作,并没有实现在队列中存储字符串。这里分享一种可以实现的方法。
关于队列的一些基本的概念这里就不在介绍,下面直接上代码。
主要实现了:
将字符串存入队列之中,代码中的 MAXSIZE 是最大的队列长度。实际中由于够成了循环队列,所以这个最大存储长度只有(MAXSIZE-1)。后面的二维数组 ais_data[MAXSIZE][250] 中250是队列中的一次存储字符串的最大的长度。
总体来说:在可以确定队列的长度的最大值的情况下,推荐使用循环队列。如果无法预知队列的长度,可以使用链表队列。
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include <string.h>
#define MAXSIZE 20
/*循环队列对的顺序存储结构*/
typedef struct
{
char ais_data[MAXSIZE][250]; //队列中的二维数组元素
int front; //头指针
int rear; //尾指针
}sqQueue;
/*初始化一个空队列*/
int InitQueue(sqQueue *Q)
{
Q->front=0; //结构体指针
Q->rear=0;
return 1;
}
/* 将队列清空 */
int ClearQueue(sqQueue *Q)
{
Q -> front = 0;
Q -> rear = 0;
return 1;
}
/*返回队列当前长度*/
int QueueLength(const sqQueue *Q)
{
return ((Q->rear - Q->front+ MAXSIZE)%MAXSIZE);
/* 返回队列中元素的个数 */
}
/*循环队列入队操作 e为插入的元素*/
int EnQueue(sqQueue *Q,char* e)
{
if((Q->rear+1)%MAXSIZE==Q->front) /*队列已满*/
{
return 0;
}
strcpy(Q->ais_data[Q->rear],e); //将元素e赋值给队尾
Q->rear=(Q->rear+1)%MAXSIZE; //如果指向最后一位则转回到数组头
return 1;
}
/*若队列不为空,则删除Q中队头元素,用e值返回*/
int DeQueue(sqQueue *Q,char *e)
{
if (Q->front==Q->rear) /*队列为空判断*/
{
return 0;
}
strcpy(e, Q->ais_data[Q->front]);
Q->front=(Q->front+1)%MAXSIZE;
return 1;
}
测试运行主函数
void main(void)
{
int a,b,Qlength;
sqQueue Q;
char ais[250];
int i=0;
InitQueue(&Q); //初始化一个空队列
a = QueueLength(&Q); //查看队列长度
printf("队列长度为%d\n",a);
EnQueue(&Q,"2019-09-02"); //队列插入元素
a = QueueLength(&Q); //查看队列长度
printf("队列长度为%d\n",a);
memset(ais,0,250); //清空历史数据
DeQueue(&Q,ais); //队列元素出队
printf("队列中的元素是 %s\r\n",ais);
for(i=0;i<15;i++) //循环插入队列
{
EnQueue(&Q,"2019-09-03");
}
a = QueueLength(&Q);
printf("队列长度为%d\n",a);
for(i=0;i<15;i++)
{
DeQueue(&Q,ais);
printf("队列中的元素是 %s\r\n",ais);
a = QueueLength(&Q);
printf("队列长度为%d\n",a);
}
a = QueueLength(&Q);
printf("队列长度为%d\n",a);
}
好奇怪,我格式明明是正确的。显示就乱了,额将就看下吧。