C语言实现循环队列(队列可存储字符串)

  项目原因,需要写一个队列来存储串口实时输出的字符串。看了网上很多博文和一些数据结构的数据,给的例子都是实现对单个数字或者字符的队列操作,并没有实现在队列中存储字符串。这里分享一种可以实现的方法。

关于队列的一些基本的概念这里就不在介绍,下面直接上代码。

主要实现了:

将字符串存入队列之中,代码中的 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);  
}

好奇怪,我格式明明是正确的。显示就乱了,额将就看下吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章