C语言链表实现队列和栈:探索数据结构的灵活运用

【数据结构|C语言版】栈和队列 各位小伙伴大家好!上次小编给大家讲解了数据结构中的重要基础:算法效率和复杂度分析,接下来我们讲解一下栈和队列!【知识框架】以上就是小编对栈和队列的讲解。如果觉得小编讲的还可以,还请一键三连。互三必回!持续更新中~! 阅读详情

标题:C语言链表实现队列和栈:探索数据结构的灵活运用

导言

队列和栈是常见的数据结构,它们在算法和系统设计中有着广泛的应用。本技术教程将使用C语言中的链表实现队列和栈,详细讲解实现过程,并附上完整的代码示例。通过学习本文,读者将深入理解链表的灵活性和在队列和栈中的应用。

1. 链表定义

在开始实现队列和栈之前,我们首先定义链表的结构:

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

// 链表节点定义
struct Node {
    int data;
    struct Node* next;
};

2. 链表实现队列

2.1 队列结构定义

struct Queue {
    struct Node* front;
    struct Node* rear;
};

2.2 队列操作函数

// 初始化队列
struct Queue* initializeQueue() {
    struct Queue* q = (struct Queue*)malloc(sizeof(struct Queue));
    q->front = q->rear = NULL;
    return q;
}

// 入队操作
void enqueue(struct Queue* q, int newData) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = newData;
    newNode->next = NULL;

    if (q->rear == NULL) {
        q->front = q->rear = newNode;
        return;
    }

    q->rear->next = newNode;
    q->rear = newNode;
}

// 出队操作
int dequeue(struct Queue* q) {
    if (q->front == NULL)
        return -1; // 空队列

    int data = q->front->data;
    struct Node* temp = q->front;

    q->front = q->front->next;

    if (q->front == NULL)
        q->rear = NULL;

    free(temp);
    return data;
}

// 销毁队列
void destroyQueue(struct Queue* q) {
    while (q->front != NULL) {
        dequeue(q);
    }
    free(q);
}

3. 链表实现栈

3.1 栈结构定义

struct Stack {
    struct Node* top;
};

3.2 栈操作函数

// 初始化栈
struct Stack* initializeStack() {
    struct Stack* s = (struct Stack*)malloc(sizeof(struct Stack));
    s->top = NULL;
    return s;
}

// 入栈操作
void push(struct Stack* s, int newData) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = newData;
    newNode->next = s->top;
    s->top = newNode;
}

// 出栈操作
int pop(struct Stack* s) {
    if (s->top == NULL)
        return -1; // 空栈

    int data = s->top->data;
    struct Node* temp = s->top;
    s->top = s->top->next;
    free(temp);

    return data;
}

// 销毁栈
void destroyStack(struct Stack* s) {
    while (s->top != NULL) {
        pop(s);
    }
    free(s);
}

4. 示例代码

4.1 队列的使用

int main() {
    struct Queue* myQueue = initializeQueue();

    enqueue(myQueue, 10);
    enqueue(myQueue, 20);
    enqueue(myQueue, 30);

    printf("Dequeue: %d\n", dequeue(myQueue));
    printf("Dequeue: %d\n", dequeue(myQueue));

    destroyQueue(myQueue);

    return 0;
}

4.2 栈的使用

int main() {
    struct Stack* myStack = initializeStack();

    push(myStack, 10);
    push(myStack, 20);
    push(myStack, 30);

    printf("Pop: %d\n", pop(myStack));
    printf("Pop: %d\n", pop(myStack));

    destroyStack(myStack);

    return 0;
}

结语

通过本文的学习,读者深入理解了如何使用链表实现队列和栈,这两种数据结构在算法和程序设计中都具有重要的应用。链表作为底层数据结构,为队列和栈提供了灵活的内存分配和元素操作方式。希望这篇教程对读者在C语言中学习和应用队列和栈时有所帮助。

数据结构 - 栈和队列(C语言实现) 一. 栈 栈的定义  栈(Stack)是一种只能在一端进行插入或删除操作的线性表。                     图一 栈的示意图 顺序栈的基本操作   初始化 void InitStack(Stack *S){ //初始化顺序栈即使栈顶指针为-1 S->Top = -1; }   栈判空 int StackEmpty(Stack *S) { //栈判空函数... 阅读详情

相关推荐

C语言实现基础数据结构:链表、栈与队列详解

数据结构是计算机科学的核心基础之一,它决定了数据的组织、存储和操作方式。在C语言中,我们可以通过指针和结构体等特性灵活地实现各种数据结构。本文将详细介绍三种基础数据结构——链表、栈和队列的C语言实现,包括它们的原理、实现方式以及应用场景。

vvilkin的学习备忘 1653

追梦之旅【数据结构篇】——详解C语言实现链队列

保姆式讲述C语言实现链队列

小梦的博客 1665

c语言 栈和队列的实现

前提知识 顺序表 优点:可以随机访问,cpu高速缓存利用率高,不涉及(较少)进行插入和删除操作,应该使用顺序表 一般而言,我们使用顺序表(数组)的形式建立 栈这一数据结构。   栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。 其特点是先进后出,模仿c++stl的stack和queue,我...

编程爱好者的博客 6919

C语言用链表(LinkedList)实现队列数据结构

用链表来处理队列真的很方便,也处理堆栈一样只要内存空间足够多就可以一直插入队列。同时出列操作也比用数组存储来的方便。

qq_40300093的博客 766

【数据结构】队列详解 && 栈和队列OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列

队列的概念和结构讲解、C语言实现队列、OJ题 —— 用队列实现栈、用栈实现队列、设计循环队列

StackFrame 1581

解决ADS1.2报错Cannot obtain license

报错如下 将licenses文件下的license内容进行修改: 修改为如下内容即可。 # # Generated on 2021-dec-1 by licwizard # PACKAGE ads armlmd 1.200 E32F0DE5161D COMPONENTS="armasm compiler bats armulate axd adwu fromelf armlink codewarrior armsd" INCREMENT ads armlmd 1.200 permanent uncounte

qq_46110320的博客 3463

队列——C语言(链表)

用链表来写队列真的比数组简单得多,本人已经发了用数组实现队列的文章,欢迎大家阅览 1.先写一个队列的接口(queue.h) /* 一个队列模块的接口 */ #include <stdlib.h> #define QUEUE_TYPE int /*队列元素的类型*/ /* ** create_queue ** 创建一个队列,参数为队列可以存储元素的最大数量 ** 这个函数只适用于动态分配数组的队列版本 */ void create_queue(size_t size); /* ** d

New_Teen的博客 840

UE5摄像机抖动全攻略:从Perlin噪点到Sequence实战(附参数调优技巧)

本文深入解析UE5摄像机抖动技术,从Perlin噪点算法到CameraShakeBase蓝图应用,再到Sequence高级控制,提供全面的参数调优技巧。涵盖战斗、爆炸等场景的预设参数,帮助开发者实现专业级抖动效果,提升游戏沉浸感。

weixin_30300225的博客 97

链式队列的基本操作(C实现)

一、链队列简介。 和链栈相似,适用于动态存储,由于是先进先出原则,因此可以用单链表表示队列,并设置一个头指针(front)和一个尾指针(rear),入队时,尾指针(rear)后移,出队时,头指针(front)后移。 二、具体操作 1.结构体定义和初始化 采用结构体套用的方法,链表的结构中有前指针和后指针,而结点中有数据域和直接后继域。 #include<stdio.h> #include<stdlib.h> #include<string.h> #defi

m0_61395860的博客 4551

Jetson AGX ORIN硬件初始化和环境部署

orin预安装了ubuntu20.04,只需开机,像重装系统一样设置用户信息即可,可以参考官网的教程[https://developer.nvidia.com/embedded/learn/get-started-jetson-agx-orin-devkit],官网提供了两种方式:一种是orin + 显示器,orin有提供DP接口,你需要准备一台显示器,最好也是有DP口的,因为我用DP转HDMI的连的,分辨率会受影响。确认安装的路径,一般直接回车安装在默认的 /home/你的名字/anaconda3。

TracyGC的博客 3836

【大模型】一图看懂3D因果卷积!

本文将系统性地介绍从1D到3D的因果卷积原理,通过直观的动图演示帮助读者理解其工作机制,并重点探讨3D因果卷积在大规模视频生成中的独特价值和应用前景。

xian0710830114的专栏 2199

C语言技能实践之链表的创建与操作

与单独由数组构成的顺序表不同的是,由于链表所具有的指针域,决定了链表可以实现结点之间的地址(所在位置)可以在结构上不相邻,只需在每个结点的数据域后添加地址信息即可通过指针将当前结点与下一结点连接起来,从而形成链表。链表的增加和插入,顾名思义,就是在一个空链表上插入一个新的结点,或是在一个结点与另一个结点之间插入一个新结点,亦或是在链表的尾结点加入一个新结点。值得注意的是,在执行头插法时,指针指向的调整顺序必须遵循以下原则:先将新结点的后继指针指向头结点的后继结点,最后再调整头结点的后继指针指向新结点。

tanjielin2003的博客 1899

ICM20948 DMP代码详解(54)

ICM20948 DMP代码详解(54)

phmatthaus的专栏 424

C语言数据结构与算法入门:链表、栈与队列的实现

本文介绍了C语言中三种基本线性数据结构(链表、栈和队列)的实现方法。主要内容包括: 链表:通过节点指针实现动态链式结构,包含创建、插入、删除和遍历操作 栈:基于数组实现后进先出(LIFO)结构,实现入栈、出栈和获取栈顶元素等功能 队列:使用数组实现先进先出(FIFO)结构,包含入队、出队和获取队头元素操作 每个模块都提供了完整的代码示例和常见错误提示,帮助读者掌握这些基础数据结构的实现原理和应用场景。

编程世界如山海,探索不止。 2万+

超详细教程YoloV8官方推荐免费数据集网站Roboflow一键导出Voc、COCO、Yolo、Csv等格式

YoloV8官方推荐了一个数据集网站,就是Roboflow。Roboflow是一个数据集管理平台,提供了免费的数据集,同时也支持上传自己的数据集进行格式转换。使用Roboflow,开发者可以方便地获取所需格式的数据集,无需手动转换格式。此外,Roboflow还提供了多种数据预处理、数据增强等功能,可帮助开发者更好地优化训练数据

Snu77的博客 2万+

爬虫瑞数5案例:联通

瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,增加服务器行为的“不可预测性”,实现了从用户端到服务器端的全方位“主动防护”,为各类 Web、HTML5 提供强大的安全保护。

老衲爱洗头的博客 4470

C语言栈和队列的实现

详细讲解栈与队列的定义和特性,用C语言分别实现顺序栈、链栈、顺序(循环)队列、链队列,已经顺序存储与链式存储的区别

k666499436的博客 6036

HANA-公司间销售ICS-IDOC系统配置-保姆级配置文档

合作伙伴编号:这个客户表示收票方(销售公司在生产公司中所对应的客户代码,卖方开票,买方收票),也就是咱们在配置消息类型输出的时候合作伙伴的类型的一个具体的客户编码,这个是站在发货工厂的角度去看的,也就是EDI 输出的 BP 合作伙伴的编号;在项目实施过程中经常会遇到关联方交易的问题,有公司间采购的业务场景,也会存在公司间销售的业务场景,本文将着重讲解公司间销售在SAP系统中的实现场景。在这个过程中,销售公司向客户开票产生应收,而生产公司向销售公司开票产生自己的应收,同时销售公司向生产公司产生应付。

我小时候很黑的博客 2393

数据结构实战:链表、栈与队列的C语言实现

本文详细介绍了链表、栈和队列的C语言实现方法。重点讲解了单链表的结构定义、初始化以及插入(头插法、尾插法、中间插入)和删除操作,分析了各种操作的时间复杂度。文章还对比了链表与数组的优缺点,强调了链表在动态内存管理方面的优势。通过代码示例展示了链表操作的关键技术点,包括结构体定义、指针操作和内存管理,为后续栈和队列的实现奠定了基础。

今天比昨天更努力一点! 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言实现栈和队列

一、栈(原理:FILO||LIFO)        实现思想:利用静态顺序表实现栈                      1.定义结构体,包含值和数组还有栈顶成员变量记录栈内元素个数(栈主要就是对栈顶元素的操作)                      2.初始化、销毁(比较简单看代码理解)                      3.增操作:先判断栈是否已满,再在栈顶进行添加;(...

Sun_student的博客 3266

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【数据结构】栈和队列的实现及应用

栈和队列

学了就忘是正常现象 3966

【C语言】数据结构——栈和队列实例探究

typedef是类型定义的意思。typedef struct 是为了使用这个结构体方便。若struct Stack {}这样来定义结构体的话。在申请Stack 的变量时,需要这样写,struct Stack n;若用typedef,可以这样写,typedef struct Stack{}ST;。在申请变量时就可以这样写,ST n;区别就在于使用时,是否可以省去struct这个关键字。//标识栈顶的位置}ST;定义了一个链式队列的数据结构。

qq_64818885的博客 1825

【数据结构】栈和队列(c语言实现)(附源码)

栈只能从同一端进行插入、删除操作,遵从“先进后出”原则;而队列只能从一端插入、另一端删除,遵从“先进先出”原则。栈和队列在一些场景的实用性很高,例如二叉树的层序遍历、快速排序的非递归实现等。

2301_80955819的博客 2097

C语言数据结构详解:数组、链表、栈、队列、树和图等的设计与实现

数据结构是计算机科学中的基本概念,用于组织和存储数据,以便高效地进行访问和修改。常见的数据结构包括数组、链表、栈、队列、树和图等。本文将介绍几种常见的数据结构及其在C语言中的实现。

科技改变人类,技术成就未来 1700

C语言数据结构—栈和队列实现

栈和队列是C语言中的两种容器,学习C语言的栈和队列有助于我们更好地理解栈和队列的底层实现。

渣檬Charman的博客 1560

【栈和队列】纯C实现栈和队列以及其基本操作-宝藏级别数据结构教程【保姆级别详细教学】

【数据结构】【栈和队列】纯C实现,宝藏级别数据结构教学。干货满满!

系统编程、网络编程 2118
上一篇: 探索C语言链表:从基础到高级
下一篇: 深入探讨C语言结构体的使用与进阶技巧
字节人生
博客等级 码龄3年 1954粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值