数据结构——顺序队列与链式队列的实现

目录

一、概念

1、队列的定义

2、队首

3、队尾

二、接口

1、可写接口

1)数据入队

2)数据出队

3)清空队列

2、只读接口

1)获取队首数据

2)获取队列元素个数

3)队列的判空

三、队列的顺序表实现

1、数据结构定义

2、初始化创造队列

3、判断队列是否满

4、判断队列是否空

5、入队

6、出队

7、打印队列

8、队列的顺序表实现源码

四、队列的链表实现

1、数据结构定义

2、初始化创造队列

3、判断队列是否空

4、入队

5、出队

6、打印队列

7、队列的链表实现源码


一、概念

1、队列的定义

  队列 是仅限在 一端 进行 插入另一端 进行 删除 的 线性表
  队列 又被称为 先进先出 (First In First Out) 的线性表,简称 FIFO 。

2、队首

  允许进行元素删除的一端称为 队首。如下图所示:

3、队尾

  允许进行元素插入的一端称为 队尾。如下图所示:

二、接口

1、可写接口

1)数据入队

  队列的插入操作,叫做 入队。它是将 数据元素 从 队尾 进行插入的过程,如图所示,表示的是 插入 两个数据(绿色 和 蓝色)的过程:

2)数据出队

  队列的删除操作,叫做 出队。它是将 队首 元素进行删除的过程,如图所示,表示的是 依次 删除 两个数据(红色 和 橙色)的过程:

3)清空队列

  队列的清空操作,就是一直 出队,直到队列为空的过程,当 队首 和 队尾 重合时,就代表队尾为空了,如图所示:

2、只读接口

1)获取队首数据

  对于一个队列来说只能获取 队首 数据,一般不支持获取 其它数据。

2)获取队列元素个数

  队列元素个数一般用一个额外变量存储,入队 时加一,出队 时减一。这样获取队列元素的时候就不需要遍历整个队列。通过 O(1) 的时间复杂度获取队列元素个数。

3)队列的判空

  当队列元素个数为零时,就是一个 空队空队 不允许 出队 操作。

三、队列的顺序表实现

1、数据结构定义

对于顺序表,在 C语言 中表现为 数组,在进行 队列的定义 之前,我们需要考虑以下几个点:
  1)队列数据的存储方式,以及队列数据的数据类型;
  2)队列的大小;
  3)队首指针;
  4)队尾指针;

我们可以定义一个 队列 的 结构体,C语言实现如下所示:

#define MAXSIZE 10
typedef int datatype;typedef struct seqqueue{datatype data[MAXSIZE];int front,rear;
}seq_queue,*seq_pqueue;

2、初始化创造队列

第一种无形参,C语言实现如下所示:

seq_pqueue init1_seqqueue(void)
{seq_pqueue q;q=(seq_pqueue)malloc(sizeof(seq_queue));if(q==NULL){perror("malloc");exit(-1);}q->front=q->rear=MAXSIZE-1;return q;
}

第二种有形参,C语言实现如下所示:

void init_seqqueue(seq_pqueue *Q)
{*Q=(seq_pqueue)malloc(sizeof(seq_queue));if((*Q)==NULL){perror("malloc");exit(-1);}(*Q)->front=(*Q)->rear=MAXSIZE-1;return;
}

3、判断队列是否满

C语言实现如下所示:

bool is_full_seqqueue(seq_pqueue q)
{if((q->rear+1)%MAXSIZE == q->front)return true;elsereturn false;
}

4、判断队列是否空

C语言实现如下所示:

bool is_empty_seqqueue(seq_pqueue q)
{if(q->rear == q->front)return true;elsereturn false;
}

5、入队

C语言实现如下所示:

bool in_seqqueue(datatype data,seq_pqueue q)
{//判断队列是否满if(is_full_seqqueue(q)){printf("队列已满!\n");return false;}//入队q->rear=(q->rear+1)%MAXSIZE;q->data[q->rear]=data;return true;
}

6、出队

C语言实现如下所示:

bool out_seqqueue(seq_pqueue q,datatype *D)
{//判断队列是否空if(is_empty_seqqueue(q)){printf("队列已空!\n");return false;}//出队q->front=(q->front+1)%MAXSIZE;*D=q->data[q->front];return true;
}

7、打印队列

C语言实现如下所示:

void show_seqqueue(seq_pqueue q)
{int i;if(is_empty_seqqueue(q))return;//非空时,从对头打印到队尾for(i=(q->front+1)%MAXSIZE;i!=(q->rear+1)%MAXSIZE;i=(i+1)%MAXSIZE){printf("%d\t",q->data[i]);}printf("\n");
}

8、队列的顺序表实现源码

seqqueue.h

#ifndef __SEQQUEUE_H__
#define __SEQQUEUE_H__#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MAXSIZE 10
typedef int datatype;typedef struct seqqueue{datatype data[MAXSIZE];int front,rear;
}seq_queue,*seq_pqueue;extern seq_pqueue init1_seqqueue(void);
extern void init_seqqueue(seq_pqueue *Q);
extern bool is_full_seqqueue(seq_pqueue q);
extern bool is_empty_seqqueue(seq_pqueue q);
extern bool in_seqqueue(datatype data,seq_pqueue q);
extern bool out_seqqueue(seq_pqueue q,datatype *D);
extern void show_seqqueue(seq_pqueue q);#endif

seqqueue.c

#include "seqqueue.h"seq_pqueue init1_seqqueue(void)
{seq_pqueue q;q=(seq_pqueue)malloc(sizeof(seq_queue));if(q==NULL){perror("malloc");exit(-1);}q->front=q->rear=MAXSIZE-1;return q;
}void init_seqqueue(seq_pqueue *Q)
{*Q=(seq_pqueue)malloc(sizeof(seq_queue));if((*Q)==NULL){perror("malloc");exit(-1);}(*Q)->front=(*Q)->rear=MAXSIZE-1;return;
}//判断队列是否满
bool is_full_seqqueue(seq_pqueue q)
{if((q->rear+1)%MAXSIZE == q->front)return true;elsereturn false;
}//入队
bool in_seqqueue(datatype data,seq_pqueue q)
{//判断队列是否满if(is_full_seqqueue(q)){printf("队列已满!\n");return false;}//入队q->rear=(q->rear+1)%MAXSIZE;q->data[q->rear]=data;return true;
}//判断队列是否空
bool is_empty_seqqueue(seq_pqueue q)
{if(q->rear == q->front)return true;elsereturn false;
}//出队
bool out_seqqueue(seq_pqueue q,datatype *D)
{//判断队列是否空if(is_empty_seqqueue(q)){printf("队列已空!\n");return false;}//出队q->front=(q->front+1)%MAXSIZE;*D=q->data[q->front];return true;
}void show_seqqueue(seq_pqueue q)
{int i;if(is_empty_seqqueue(q))return;//非空时,从对头打印到队尾for(i=(q->front+1)%MAXSIZE;i!=(q->rear+1)%MAXSIZE;i=(i+1)%MAXSIZE){printf("%d\t",q->data[i]);}printf("\n");
}

test.c

#include "seqqueue.h"
/* 用循环队列实现如下功能:* 用户从键盘输入整数,程序将其入队;* 用户从键盘输入字母,程序将队头元素出队;* 并在每一次出队和入队之后打印队列元素。*/
int main(int argc, const char *argv[])
{seq_pqueue q;datatype data,t,ret;init_seqqueue(&q);while(1){printf("请输入一个整数或字符:");ret=scanf("%d",&data);//输入整数时,入队if(ret == 1){if(in_seqqueue(data,q))show_seqqueue(q);}else{//输入为字符时if(out_seqqueue(q,&t)){printf("out:%d\n",t);show_seqqueue(q);}//清空输入缓冲区while(getchar()!='\n');}}return 0;
}

Makefile

CC = gcc
CFLAGS = -o0 -g -WallSRC=seqqueue.c test.c
OBJS=test$(OBJS):$(SRC)$(CC) $(CFLAGS) -o $@ $^.PHONY:clean
clean:rm -rf $(OBJS) *.o
  • "-o0"表示优化级别为0,即关闭优化。这将导致生成的可执行文件较大,但是可以方便地进行调试。
  • "-g"表示生成调试信息,以便在调试程序时可以查看变量的值、函数的调用栈等信息。
  • "-Wall"表示启用所有警告,编译器将会显示所有可能的警告信息,帮助开发人员发现潜在的问题。

编译结果测试:

四、队列的链表实现

1、数据结构定义

对于链表,在进行 队列的定义 之前,我们需要考虑以下几个点:
  1)队列数据的存储方式,以及队列数据的数据类型;
  2)队列的大小;
  3)队首指针;
  4)队尾指针;

我们可以定义一个 队列 的 结构体,C语言实现如下所示:

typedef int datatype;typedef struct linkqueuenode{ datatype data;                    /* 数据域 */struct linkqueuenode *next;       /* 指针域 */
}linkqueue_node,*linkqueue_pnode;typedef struct linkqueue{linkqueue_pnode front,rear;       /* 链队列指针 */
}link_queue,*link_pqueue;

2、初始化创造队列

C语言实现如下所示:

void init_linkqueue(link_pqueue *Q)
{//申请front和rear的空间*Q=(link_pqueue)malloc(sizeof(link_queue));if((*Q)==NULL){perror("malloc");exit(-1);}//申请头结点空间(*Q)->front=(linkqueue_pnode)malloc(sizeof(linkqueue_node));if((*Q)->front==NULL){perror("malloc");exit(-1) ;}(*Q)->front->next=NULL;(*Q)->rear=(*Q)->front;return;
}

3、判断队列是否空

C语言实现如下所示:

bool is_empty_linkqueue(link_pqueue q)
{if(q->rear == q->front)return true;elsereturn false;
}

4、入队

C语言实现如下所示:

bool in_linkqueue(datatype data,link_pqueue q)
{linkqueue_pnode  new;//申请数据结点空间new=(linkqueue_pnode)malloc(sizeof(linkqueue_node));if(new==NULL){puts("入队失败!");return false;}//将数据存储在申请的空间new->data=data;//将new指向的结点插入到链式队列中new->next=q->rear->next;q->rear->next=new;//让rear指针指向新的队尾结点q->rear=q->rear->next;return true;
}

5、出队

C语言实现如下所示:

bool out_linkqueue(link_pqueue q,datatype *D)
{linkqueue_pnode t;//判断队列是否空if(is_empty_linkqueue(q)){printf("队列已空!\n");return false;}//出队t=q->front;q->front =q->front->next;*D=q->front->data;free(t);return true;
}

6、打印队列

C语言实现如下所示:

void show_linkqueue(link_pqueue q)
{linkqueue_pnode p;if(is_empty_linkqueue(q))return;//非空时,从对头打印到队尾for(p=q->front->next;p!=NULL;p=p->next){printf("%d\t",p->data);}printf("\n");
}

7、队列的链表实现源码

linkqueue.h

#ifndef __LINKQUEUE_H__
#define __LINKQUEUE_H__#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>typedef int datatype;typedef struct linkqueuenode{datatype data;struct linkqueuenode *next;
}linkqueue_node,*linkqueue_pnode;typedef struct linkqueue{linkqueue_pnode front,rear;
}link_queue,*link_pqueue;extern void init_linkqueue(link_pqueue *Q);
extern bool is_empty_linkqueue(link_pqueue q);
extern bool in_linkqueue(datatype data,link_pqueue q);
extern bool out_linkqueue(link_pqueue q,datatype *D);
extern void show_linkqueue(link_pqueue q);#endif

linkqueue.c      

#include "linkqueue.h"void init_linkqueue(link_pqueue *Q)
{//申请front和rear的空间*Q=(link_pqueue)malloc(sizeof(link_queue));if((*Q)==NULL){perror("malloc");exit(-1);}//申请头结点空间(*Q)->front=(linkqueue_pnode)malloc(sizeof(linkqueue_node));if((*Q)->front==NULL){perror("malloc");exit(-1) ;}(*Q)->front->next=NULL;(*Q)->rear=(*Q)->front;return;
}//入队
bool in_linkqueue(datatype data,link_pqueue q)
{linkqueue_pnode  new;//申请数据结点空间new=(linkqueue_pnode)malloc(sizeof(linkqueue_node));if(new==NULL){puts("入队失败!");return false;}//将数据存储在申请的空间new->data=data;//将new指向的结点插入到链式队列中new->next=q->rear->next;q->rear->next=new;//让rear指针指向新的队尾结点q->rear=q->rear->next;return true;
}bool is_empty_linkqueue(link_pqueue q)
{if(q->rear == q->front)return true;elsereturn false;
}//出队
bool out_linkqueue(link_pqueue q,datatype *D)
{linkqueue_pnode t;//判断队列是否空if(is_empty_linkqueue(q)){printf("队列已空!\n");return false;}//出队t=q->front;q->front =q->front->next;*D=q->front->data;free(t);return true;
}void show_linkqueue(link_pqueue q)
{linkqueue_pnode p;if(is_empty_linkqueue(q))return;//非空时,从对头打印到队尾for(p=q->front->next;p!=NULL;p=p->next){printf("%d\t",p->data);}printf("\n");
}

test.c

#include "linkqueue.h"
/* 用链式队列实现如下功能:* 用户从键盘输入整数,程序将其入对;* 用户从键盘输入字母,程序将队头元素出队;* 并在每一次出队和入队之后打印队列元素。*/
int main(int argc, const char *argv[])
{link_pqueue q;datatype data,t,ret;init_linkqueue(&q);while(1){printf("请输入一个整数或字符:");ret=scanf("%d",&data);//输入整数时,入对if(ret == 1){if(in_linkqueue(data,q))show_linkqueue(q);}else{//输入为字符时if(out_linkqueue(q,&t)){printf("out:%d\n",t);show_linkqueue(q);}//清空输入缓冲区while(getchar()!='\n');}}return 0;
}

Makefile 

CC = gcc
CFLAGS = -o0 -g -WallSRC=linkqueue.c test.c
OBJS=test$(OBJS):$(SRC)$(CC) $(CFLAGS) -o $@ $^.PHONY:clean
clean:rm -rf $(OBJS) *.o
  • "-o0"表示优化级别为0,即关闭优化。这将导致生成的可执行文件较大,但是可以方便地进行调试。
  • "-g"表示生成调试信息,以便在调试程序时可以查看变量的值、函数的调用栈等信息。
  • "-Wall"表示启用所有警告,编译器将会显示所有可能的警告信息,帮助开发人员发现潜在的问题。

编译结果测试:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/315907.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python封装接口自动化测试套件

在Python中&#xff0c;我们可以使用requests库来实现接口自动化测试&#xff0c;并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例&#xff1a; 首先&#xff0c;我们需要安装所需的库&#xff1a; pip install requests …

克隆clone github上某个项目的子目录

有时会遇到只需要克隆github某个项目的子目录&#xff0c;此时可以使用以下方法实现&#xff1a; 需求示例&#xff1a; 现需要克隆&#xff1a;https://github.com/SingleZombie/DL-Demos项目中的ddim项目 注&#xff1a;ddim项目的地址为&#xff1a;https://github.com/Sing…

Adobe Photoshop 2017(PS2017)安装包下载及安装教程

Photoshop 2017下载链接&#xff1a;https://docs.qq.com/doc/DUmVpdUVNbU1wTG10 1.选中下载的压缩包&#xff0c;然后鼠标右键选择解压到“Photoshop CC2017“文件夹 2.双击打开“Photoshop CC2017”文件夹 3.再次打开“Setup”文件夹 4.选中“Setup.exe”右键选择以管理员身份…

关于Python里xlwings库对Excel表格的操作(二十五)

这篇小笔记主要记录如何【如何使用xlwings库的“Chart”类创建一个新图表】。 前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2…

解决Android AAPT: error: resource android:attr/lStar not found. 问题

错误信息 /xxx/gjc/.gradle/caches/transforms-2/files-2.1/930c42acd29d295ce5bc495c3b84423e/core-1.9.0/res/values/values.xml:104:5-113:25: AAPT: error: resource android:attr/lStar not found. not found 资源位置 场景 原Android studio中的项目都是在git上面拉的老项…

【逆向】C与汇编的关系

程序1 使用 VC6.0 编译如下程序&#xff08;使用 VC6.0 的原因是该编译器不会对代码进行过多的优化&#xff0c;因此适合逆向入门&#xff09; // 01.cpp : Defines the entry point for the console application. // # include "stdafx.h"int main(int argc, char…

LeetCode第32题 : 最长有效括号

题目介绍 给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()" 示例 2&#xf…

智能语音信息处理团队EMNLP 2023入选论文解析

2023年12月6日至10日&#xff0c;自然语言处理领域顶会EMNLP 2023在新加坡举行。语音及语言信息处理国家工程研究中心智能语音信息处理团队共3篇论文被会议主会及Findings接收&#xff0c;论文方向涵盖多方对话、大语言模型应用、小说理解等&#xff0c;各接收论文解读见后文。…

.NET Core NPOI导出复杂Excel

一、引入NPOI NuGet&#xff1a; NPOI GitHub源码地址&#xff1a; GitHub - tonyqus/npoi: a .NET library that can read/write Office formats without Microsoft Office installed. No COM, no interop. 版本说明&#xff1a; NPOI 2.4.1 &#xff08;注意不同版本可能使用…

k8s的二进制部署(二)网络

节点部署完成之后,节点的状态都是Notready&#xff0c;所以要部署k8s网络&#xff1a; k8s的网络类型&#xff1a; k8s中的通信模式&#xff1a; pod内部之间容器与容器之间的通信。 在同一个pod中的容器共享资源和网络&#xff0c;使用同一个网络命名空间&#xff0c;可以直…

【并发设计模式】聊聊Thread-Per-Message与Worker-Thread模式

在并发编程中&#xff0c;核心就是同步、互斥、分工。 同步是多个线程之间按照一定的顺序进行执行&#xff0c;比如A执行完&#xff0c;B在执行。而互斥是多个线程之间对于共享资源的互斥。两个侧重点不一样&#xff0c;同步关注的是执行顺序&#xff0c;互斥关注的是资源的排…

【vue3】-

创建vue3工程 在终端输入以下命令&#xff0c;根据自己的需求做出相应的选择&#xff1a; 生成的项目文件作用&#xff1a; extensions.json&#xff1a;插件 favicon.ico&#xff1a;页签图标 env.d.ts&#xff1a;ts不认识.css .html .txt .js……文件&#xff0c;这个文件…