首页 > 其他分享 >C语言数据结构队列实现-顺序队列

C语言数据结构队列实现-顺序队列

时间:2024-06-17 16:45:09浏览次数:24  
标签:head 顺序 队列 list C语言 int 数据结构 rear

顺序队列,即采用顺序表模拟实现的队列结构。

我们知道,队列具有以下两个特点:
数据从队列的一端进,另一端出;
数据的入队和出队遵循"先进先出"的原则;

因此,只要使用顺序表按以上两个要求操作数据,即可实现顺序队列。首先来学习一种最简单的实现方法

顺序队列简单实现

由于顺序队列的底层使用的是数组,因此需预先申请一块足够大的内存空间初始化顺序队列。除此之外,为了满足顺序队列中数据从队尾进,队头出且先进先出的要求,我们还需要定义两个指针(top 和 rear)分别用于指向顺序队列中的队头元素和队尾元素,如图 1 所示:
image

由于顺序队列初始状态没有存储任何元素,因此 top 指针和 rear 指针重合,且由于顺序队列底层实现靠的是数组,因此 top 和 rear 实际上是两个变量,它的值分别是队头元素和队尾元素所在数组位置的下标。

在图 1 的基础上,当有数据元素进队列时,对应的实现操作是将其存储在指针 rear 指向的数组位置,然后 rear+1;当需要队头元素出队时,仅需做 top+1 操作。

例如,在图 1 基础上将 {1,2,3,4} 用顺序队列存储的实现操作如图 2 所示:
image
image
在图 2 基础上,顺序队列中数据出队列的实现过程如图 3 所示:
image
image

因此,使用顺序表实现顺序队列最简单方法的 C 语言实现代码为:

#include <stdlib.h>
#define MaxSize 10 
//顺序队列操作
int insertList(int * list, int head, int elem){
    list[head] = elem;
    head = head+1;
    return head;
}

int   outlist(int * list,int head){
    int data = list[head];
    printf("%d\n",data);
    head = head+1;
    return head;
}

void listprint(int * list, int tail){
    for(int i=0;i<tail;i++){
        printf("%d\n",list[i]);
    }
}

int main(){
    
    int head=0;
    int tail=0;
    int list[MaxSize];
    tail = insertList(list,tail,7);
    tail = insertList(list,tail,67);
    tail = insertList(list,tail,34);
    tail = insertList(list,tail,44);
    tail = insertList(list,tail,33);

    head = outlist(list,head);
    head = outlist(list,head);
    head = outlist(list,head);
    
    //listprint(list, tail);
    return(0);
}

有个问题是浪费空间所以考虑优化下如图:
image

#include <stdlib.h>
#define MaxSize 10 
int insertList(int * list, int head, int elem){
    int pos = head%MaxSize;//通过取余操作
    list[pos] = elem;
    return head+1;
}

int outlist(int * list,int head){
    int pos = head%MaxSize;
    int data = list[pos];
    printf("%d\n",data);
    return head+1;
}

// void listprint(int * list, int tail){
//     for(int i=0;i<tail;i++){
//         printf("%d\n",list[i]);
//     }
// }

int main(){
    
    int head=0;
    int tail=0;
    int list[MaxSize];
    tail = insertList(list,tail,7);
    tail = insertList(list,tail,67);
    tail = insertList(list,tail,34);
    tail = insertList(list,tail,44);
    tail = insertList(list,tail,33);
    
    
    head = outlist(list,head);
    head = outlist(list,head);
    head = outlist(list,head);
    
    //listprint(list, tail);
    return(0);
}

标签:head,顺序,队列,list,C语言,int,数据结构,rear
From: https://www.cnblogs.com/zh718594493/p/18252688

相关文章

  • 【c语言】字符串函数和内存函数
    ......
  • 【数据结构】线性表之《顺序表》超详细实现
    顺序表一.数据结构1.逻辑结构2.物理结构二.顺序表的分类1.静态顺序表2.动态顺序表三.顺序表的实现1.创建顺序表2.初始化顺序表3.判断是否扩容4.打印顺序表5.插入操作1.头插2.尾插3.按照下标插入6.删除操作1.头删2.尾删3.按照下标删除7.查找数据8.修改数据9.清空顺序......
  • 华为OD机试C卷(100分)-绘图机器(C语言)
    题目描述绘图机器的绘图笔初始位置在原点(0,0)机器启动后按照以下规则来进行绘制直线。尝试沿着横线坐标正向绘制直线直到给定的终点E期间可以通过指令在纵坐标轴方向进行偏移,offsetY为正数表示正向偏移,为负数表示负向偏移给定的横坐标终点值E以及若干条绘制指令,......
  • c语言回顾-结构体
    前言在前面的学习中,我们知道C语言提供了许多内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的。当我们想描述学生,描述一本书,这时单一的内置类型是不行的。描述一个学生需要名字、年龄、学号、身高、体重等;描述一本书需要作者、出版社、定价......
  • 【并发程序设计】总篇集 Linux下 C语言 实现并发程序
    11_Concurrent_Programing文章目录11_Concurrent_Programing1.进程概念进程内容进程类型进程状态2.进程常用命令进程信息命令top命令进程信息表进程优先级命令nice命令renice命令后台进程命令3.子进程创建子进程fork函数结束进程exit函数_exit函数回收子进......
  • 【C语言】字符指针
    在指针的类型中我们知道有一种指针类型为字符指针char*;一般使用:intmain(){charch='w';char*pc=&ch;*pc='w';return0;}还有一种使用方式如下:intmain(){constchar*pstr="hellobit.";//这里是把一个字符串放到pstr指针变量里了吗?printf......
  • Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合
    Redis是一个高性能的键值对数据库,它支持多种数据结构,如字符串、列表、集合、有序集合和哈希表。以下是一些Redis命令的实践示例,帮助你了解如何使用Redis。连接Redis服务器首先,使用redis-cli命令连接到Redis服务器:redis-cli-h<hostname>-p<port>基本命令PING:检查Redis......
  • C语言笔记第15篇:文件操作
    1、为什么使用文件?如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用文件。2、什么是文件?磁盘(硬盘)上的文件就是文件。但是程序设计中,我们一般谈两个文......
  • Java基础:B树、B+树和红黑树的数据结构,三者区别
    B树(B-Tree)数据结构节点结构:每个节点包含多个键值和子节点指针。阶(Degree):B树的阶定义了每个节点的最小和最大键值数。对于阶为(m)的B树:每个节点最多有(m-1)个键值和(m)个子节点。每个节点(除了根节点)至少有(\lceilm/2\rceil-1)个键值和(\lceilm/......
  • C语言程序设计(第四版)第十章主要内容
    本章主要讲述了<字符串>一、字符串字面量1.字符串字面量,有时也称为字符串常量,它是由一对双引号括起来的一个字符序列。2."a"是字符串字面量,而'a'是字符常量。3.字符串实际就是由若干有效字符构成且以'\0'作为结束的一个字符序列。二、字符串的存储1.字符串结束标志'\0'也......