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);  
}

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

  • 15
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个有关编程的问题,让我来帮您解答。以下是一个C语言实现队列代码,可以存储一个字符串和长度: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_SIZE 100 //队列的最大容量 // 队列结构体 typedef struct { char str[MAX_SIZE]; //存储字符串 int length; //字符串长度 } Queue; // 初始化队列 void init(Queue *queue) { queue->length = 0; memset(queue->str, 0, MAX_SIZE); //清空队列数据 } // 入队列 int enqueue(Queue *queue, char *str) { if (queue->length < MAX_SIZE) { strcpy(queue->str, str); queue->length = strlen(str); return 0; //入队列成功 } else { return -1; //队列已满 } } // 出队列 char* dequeue(Queue *queue) { if (queue->length > 0) { char *str = queue->str; //保存字符串引用 init(queue); //清空队列数据 return str; } else { return NULL; //队列为空 } } int main() { Queue queue; init(&queue); char input_str[MAX_SIZE] = "hello, world!"; int result = enqueue(&queue, input_str); if (result == 0) { printf("队列队列成功!\n"); } else { printf("队列已满!\n"); return 1; } char *output_str = dequeue(&queue); if (output_str != NULL) { printf("队列队列成功!出队列字符串为:%s\n", output_str); } else { printf("队列为空!\n"); return 1; } return 0; } ``` 这段代码实现了一个基本的队列结构,通过调用 `enqueue` 方法可以往队列中添加一个字符串,调用 `dequeue` 方法可以从队列中取出最先添加的字符串。我希望这个代码能对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值