首页 > 其他分享 >数据结构之队列(c语言版)

数据结构之队列(c语言版)

时间:2024-04-11 11:46:50浏览次数:22  
标签:Queue 队列 queue enQueue int 数据结构 data 语言版

队列(Queue):在逻辑上是一种线性存储结构。它有以下几个特点:
1、队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的。
2、 队列只允许在"队首"进行删除操作,而在"队尾"进行插入操作。
队列通常包括的两种操作:入队列 和 出队列。

队列的种类也很多,单向队列,双向队列,循环队列。

底层可以由数组(顺序表),链表实现。

一、数组队列

基于数组实现的单向队列:

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

static int *queue=NULL;//指向队列
static int count=0;//元素数量
static int MAXSIZE=20;//队列容量


//创建队列
int *create_queue(){
    queue=(int *)malloc(MAXSIZE*sizeof(int));//分配空间
    if(!queue){
        printf("queue error!");
        exit(0);
    }
    return queue;//返回队列
}

//判空
int Empty(){
    if(count==0){
        return 1;
    }
    return 0;
}
//判满
int full(){
    if(MAXSIZE==count){
        return 1;
    }
    return 0;
}
//入队
void enQueue(int e){
    if(full()){
        printf("队列已满,不允许入队\n");
        exit(0);
    }
    queue[count++]=e;
    printf("enQueue successful!!\n");
}
//出队
int deQueue(){
    if(Empty()){
        printf("空队,无法出队\n");
        exit(0);
    }
    int n=queue[0];
    for(int i=0;i<count;i++){
        queue[i]=queue[i+1];
    }
    count--;
    return n;
}
//遍历
void display(){
    printf("队列有%d个元素\n",count);
    for(int i=0;i<count;i++){
        printf("The data is %d\n",queue[i]);
    }
    printf("遍历结束\n");

}

//销毁队列
void destory(){
    if(queue){
        free(queue);
    }
    printf("destory!!!");
}


主函数:

int main(){
    int *p=create_queue();
    enQueue(2);
    enQueue(8);
    enQueue(108);
    enQueue(99);
    enQueue(9);
    enQueue(4);
    display();
    deQueue();
    deQueue();
    display();
    destory();

}

输出:

enQueue successful!!
enQueue successful!!
enQueue successful!!
enQueue successful!!
enQueue successful!!
enQueue successful!!
队列有6个元素       
The data is 2       
The data is 8       
The data is 108
The data is 99
The data is 9
The data is 4
遍历结束
队列有4个元素
The data is 108
The data is 99
The data is 9
The data is 4
遍历结束
destory!!!

二、链表队列

基于链表实现的单向队列

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


typedef struct queue
{
    int data;
    struct queue *next;
   
}Queue;

static int count=0;//数量
static Queue *head=NULL;//队首
static Queue *tail=NULL;//队尾


//节点初始化
Queue *init(){
    Queue *p=(Queue *)malloc(sizeof(Queue));
    return p;
}

//创建队列
Queue *create_queue(){
    head=init();
    tail=head;
    if(!head){
        printf("queue error!");
        exit(0);
    }
    count++;
    return head;
}

//判空
int Empty(){
    if(count<=1){
        return 1;
    }
    return 0;
}
//入队
void enQueue(int e){
    Queue *p=init();
    p->data=e;
    tail->next=p;
    tail=p;

    count++;//数量增加
    printf("enQueue!\n");
}
//出队
int deQueue(){
    if(Empty()){
        printf("queue Null");
        exit(0);
    }
    Queue *p=head->next;
    int n=p->data;

    head->next=p->next;
    free(p);

    count--;
    printf("dequeue!!\n");
    return n;
}
//遍历
void display(){
    if(Empty()){
        printf("Null queue");
        exit(0);
    }

    printf("队列中有%d个元素\n",count);
    Queue *p=head->next;
    for(int i=1;i<count;i++){
        printf("The data is %d\n",p->data);
        p=p->next;
    }

    printf("display close!\n");
}

主函数:

int main(){
    Queue *p=create_queue();
    enQueue(2);
    enQueue(8);
    enQueue(108);
    enQueue(99);
    enQueue(9);
    enQueue(4);

    display();

    deQueue();
    deQueue();

    display();

}

输出:

enQueue!
enQueue!
enQueue!
enQueue!
enQueue!
enQueue!
队列中有7个元素
The data is 2
The data is 8
The data is 108
The data is 99
The data is 9
The data is 4
display close!
dequeue!!
dequeue!!
队列中有5个元素
The data is 108
The data is 99
The data is 9
The data is 4
display close!

数据结构与算法学习目录

标签:Queue,队列,queue,enQueue,int,数据结构,data,语言版
From: https://www.cnblogs.com/cgl-dong/p/18128692

相关文章

  • 数据结构之二叉树(c语言版)
    之前的都是线性结构,而树结构在计算机应用中的应用更加广泛。linux中的目录结构,某些数据库的底层存储等,都是采用树结构进行构架的。树的概念线性表是一对一的关系,而树是一对多的关系。树的结点:包含一个数据元素及若干指向子树的分支;孩子结点:结点的子树的根称为该结点的孩子;双......
  • 数据结构之图(c语言版)
    图是比树更复杂的结构,树是一对多的关系,图是多对多的关系。一、基本概念1、定义:图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;其中,点通常被成为"顶点(vertex)",而点与点之间的连线则被成为"边或弧"(edege)。通常记为,G=(V,E)。2、根据边是否有方向,将图可以划分......
  • 链表(java语言版)
    链表(Linkedlist)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。使用链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域......
  • 排序算法(c语言版)
    排序算法(c语言版)1、插入排序#include<stdio.h>//插入排序,升序voidinsertion_sort(intarr[],intlen){inti,j,key;for(i=1;i<len;i++){key=arr[i];//arr[i]为待插入的元素,保存在key中j=i-1;wh......
  • 数据结构与算法引言
    数据结构与算法引言数据结构和算法是计算机专业重要的基础课程。数据结构是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。算法简单来说就是解决问题的步骤。有了一个个数据结构和算法,我们可以编写出高质量的代码,高性能的产品。数据结构数......
  • C语言简单的数据结构:单链表的有关算法题(1)
    算法题重点在于思路,代码其实并不难,这里的每一题都提供多种思路,大家可以动手写一下,并找到更好的解题方法这里先介绍前三道题目:1.单链表相关经典算法OJ题1:移除链表元素2.单链表相关经典算法OJ题2:反转链表3.单链表相关经典算法OJ题4:链表的中间结点1.单链表相关经典算......
  • C语言简单的数据结构:单链表
    目录:1.单链表的概念及结构2.单链表的实现2.1单链表的定义、创建和打印2.11单链表的定义2.12单链表的创建2.13单链表的打印2.2单链表的头插和尾插2.21尾插2.22头插2.3单链表的头删和尾删2.31尾删2.31头删2.4单链表的查找2.5单链表指定位置的插入和删除2.51指定位置前......
  • (Java)数据结构——排序(第一节)堆排序+PTA L2-012 关于堆的判断
    前言本博客是博主用于复习数据结构以及算法的博客,如果疏忽出现错误,还望各位指正。堆排序(HeapSort)概念堆排序是一种基于堆数据结构的排序算法,其核心思想是将待排序的序列构建成一个最大堆(或最小堆),然后将堆顶元素与最后一个元素交换,再将剩余元素重新调整为最大堆(或最小堆),重复......
  • 数据结构:单链表
    一.链表的概念及结构概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。但是在逻辑结构上是顺序的。链表的结构其实就像的火车:车厢是独立存在的,且每节车厢都有车门。想象⼀下这样的场景,假设每节车厢的车门都是锁......
  • 初识--数据结构
    什么是数据结构?我们为什么要学习数据结构呢....一系列的问题就促使我们不得不了解数据结构。我们不禁要问了,学习C语言不就够了吗?为什么还要学习数据结构呢?这是因为:数据结构能够解决C语言解决不了的问题,比如:图形,树状图...要了解数据结构,就必须要知道:数据,数据项,数据元素,数据对象,......