C数据结构:队列

简介

队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出
FIFO(First In First Out) 的特点。

入队列:进行插入操作的一端称为队尾 。

出队列:进行删除操作的一端称为队头。

入队出队形式:一种入队顺序,只有一种出队顺序。

队列的应用:比如生活中排队买东西,先排队的先购买,平时我们用微信聊天,用键盘进行各种数字的输入,到聊天框中输出,也是队列的应用。

顺序存储队列

循环的队列:

        1.头元素指向的数据永远不能有有效数据
        2.头元素和尾元素一样,则为空
        3.(尾元素+1)%数组长度 == 头元素  则,队列已满

main.c

#include <stdlib.h>
#include <stdio.h>
#include "queue.h"

int main()
{
    
    queue* qu;
    qu = qu_create();
    if(qu == NULL)
        return -1;
   
   datatype arr[] = {1,2,3,4,5};
    for(int i=0;i<5;i++)
    {
        qu_enqueue(qu,&arr[i]);
    }
    datatype tmp;
    qu_travel(qu);
    qu_dequeue(qu,&tmp);
    qu_dequeue(qu,&tmp);
    qu_travel(qu);

    qu_destroy(qu);

    return 0;
}

quque.h

#ifndef QUEUE_H
#define QUEUE_H

#define MAXSIZE 5
typedef  int datatype;

typedef struct node_st
{
    datatype data[MAXSIZE];
    int head,tail;
}queue;


queue* qu_create();

int qu_isempty(queue*qu);

int qu_enqueue(queue*qu,datatype*data);

int qu_dequeue(queue*qu,datatype*data);

void qu_travel(queue*qu);

void qu_clear(queue*qu);

void qu_destroy(queue*qu);

#endif

queue.c

#include <stdlib.h>
#include <stdio.h>
#include "queue.h"


queue* qu_create()
{
   queue*qu;
   qu = malloc(sizeof(*qu));
   if(qu == NULL)
     return NULL;
   qu->head = 0;
   qu->tail = 0;
   return qu;

}

int qu_isempty(queue*qu)
{
    if(qu->tail == qu->head)
        return 0;
    return 1;
}
int qu_enqueue(queue*sq,datatype*x)
{
    if((sq->tail+1)%MAXSIZE == sq->head) // 队列满
        return -1;
   sq->tail = (sq->tail +1)%MAXSIZE; //取模构成一个循环
   sq->data[sq->tail] = *x;


}
int qu_dequeue(queue*qu,datatype*data)
{
    if(qu_isempty(qu) ==0)
        return -1;
    qu->head = (qu->head+1)%MAXSIZE;
    qu->data[qu->head] = *data;

    return 0;
}
void qu_travel(queue*qu)
{
    if(qu->head == qu->tail) //队列为空
        return;
    int i;
    i = (qu->head +1)%MAXSIZE;
    while(i != qu->tail )
    {
        printf("%d ",qu->data[i]);
        i = (i+1)%MAXSIZE;
    }
    printf("%d \n",qu->data[i]); //输出最后一个函数
}


void qu_clear(queue*qu)
{
    qu->head = qu->tail;

}
void qu_destroy(queue*qu)
{
    free(qu);
}

链式存储队列

顺序存储长度固定不利于使用,链式存储利于使用。(还是对链表lib2的封装,大家可以看看之前的文章:C数据结构:链表高级篇

main.c

#include <stdlib.h>
#include <stdio.h>
#include "llist.h"
#include "queue.h"

struct score_st
{
    int id;
    char name[32];
    int math;
    int chinese;
};

void print_s(const void *record)
{
    const struct score_st*r = record;
    printf("%d %s %d %d \n",r->id,r->name,r->math ,r->chinese);

}

int main()
{
    QUEUE*qu;
    struct score_st temp;
    qu = queue_create(sizeof(struct score_st ));
    for(int i=0;i<5;i++)
    {
        temp.id = i;
        snprintf(temp.name,32,"std_%d",i);
        temp.math = rand()%100;
        temp.chinese = rand()%100;
        queue_en(qu,&temp);
    }
    while(1)
    {
        int ret;
       ret =  queue_de(qu,&temp);
        if(ret == -1)
            break;
        print_s(&temp);
    }

    queue_destroy(qu);

    return 0;
}




queue.c

#include "queue.h"

QUEUE* queue_create(int size)
{
    return llist_create(size);
}

int queue_en(QUEUE*ptr,const void *data)
{
    return llist_insert(ptr,data,LLIST_BACKWARD);
}

static int alway_match(const void*p1,const void*p2)
{
    return 0;
}

int queue_de(QUEUE*ptr,void*data)
{
    return llist_fetch(ptr,(void*)0,alway_match,data); //第二参数填什么都可以
}
void queue_destroy(QUEUE*ptr)
{
    llist_destroy(ptr);
}

queue.h

#ifndef QUQUE_H
#define QUQUE_H
#include "llist.h"

typedef LLIST QUEUE;


QUEUE* queue_create(int size);

int queue_en(QUEUE*ptr,const void *data);

int queue_de(QUEUE*ptr,void*data);

void queue_destroy(QUEUE*ptr);


#endif 

相关推荐

  1. C数据结构队列

    2024-05-10 02:24:04       39 阅读
  2. C++数据结构——队列queue

    2024-05-10 02:24:04       22 阅读
  3. [数据结构] 栈和队列C++作业

    2024-05-10 02:24:04       43 阅读
  4. 算法与数据结构 循环队列C++)

    2024-05-10 02:24:04       42 阅读
  5. 算法与数据结构队列C++)

    2024-05-10 02:24:04       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 02:24:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 02:24:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 02:24:04       87 阅读
  4. Python语言-面向对象

    2024-05-10 02:24:04       96 阅读

热门阅读

  1. Spring Security 入门 2

    2024-05-10 02:24:04       25 阅读
  2. AtCoder Beginner Contest 336 B题 CTZ

    2024-05-10 02:24:04       29 阅读
  3. js强大的运算符:??、??=

    2024-05-10 02:24:04       32 阅读
  4. C:STDIN_FILENO和stdin的区别

    2024-05-10 02:24:04       31 阅读
  5. 用wordpress为外贸进出口公司搭建多语言国际站

    2024-05-10 02:24:04       35 阅读
  6. Linux 常用命令

    2024-05-10 02:24:04       39 阅读
  7. Qt建立服务端和客户端

    2024-05-10 02:24:04       36 阅读