数据结构day03(栈 Stack 顺序栈、链式栈 )内含具体详细代码实现

目录

【1】栈  Stack

1》栈的定义

 2》顺序栈

 2》链式栈

 4》顺序栈的链式栈的区别


【1】栈  Stack

1》栈的定义

栈:是只允许在一端进行插入或删除的线性表,首先栈是一种线性表,但限定这种线性表只能在某一端进行插入和删除操作。

栈顶:线性表允许进行插入删除的一端

栈底:固定的,不允许进行插入和删除的另一端

空栈:不含任何元素的空表


栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构

 2》顺序栈

特性

逻辑结构:线性结构

存储结构:顺序结构

操作:创空栈、入栈、出栈、判空和判满

 创空:

入栈:

出栈:

 代码展示:

#include <stdio.h>
#include <stdlib.h>typedef int data_t;//重定义整型
typedef struct stack//重定义栈节点结构体类型
{int maxlen;//栈的最大长度,表示数组元素个数data_t *data;//用来指向存放数据的指针相当于数组int top;//定义一个变量表示栈顶的下标
} stack_t;/*创空栈*/
stack_t *Create(int len)//len表示创建栈时的最大元素长度
{stack_t *s = (stack_t *)malloc(sizeof(stack_t));//开辟顺序栈结构体的堆区空间if (NULL == s)//容错判断{perror("malloc lost\n");return NULL;}s->data = (data_t *)malloc(sizeof(data_t) * len);//开辟一个堆区空间,让data指针指向该空间,用于存放数据,相当于数组if (NULL == s->data)//容错判断{perror("malloc lost\n");}//初始化结构体s->maxlen = len;//最大元素个数初始化为建栈的长度s->top = -1;//初始化栈顶下标为-1return s;//返回创建的栈的结构体指针
}/*判满*/
int Full(stack_t *p)
{return p->top + 1 == p->maxlen;//当栈顶元素的下标加一就是数据元素个数 等于最大元素个数时,栈满
}/*入栈*/
void Push(stack_t *p, int data)//栈的地址和要入栈的数据
{if (Full(p))//先判满,容错判断{perror("In error\n");}p->top++;//下标先加一,因为初始化时下标为-1,需要将下标加到0下标处,开始入栈,后面也是每进一个数据,栈顶下标都加一p->data[p->top] = data;//往加一后的下标位置插入数据
}/*判空*/
int Empty(stack_t *p)
{return p->top == -1;//当栈顶下标的值为-1时说明栈内没有数据,和创空栈时一样
}/*出栈*/
int Pop(stack_t *p,int top)
{if (Empty(p))//判空,容错判断{perror("Out error\n");}for(int i = top;i >= 0;i--)//for循环,从栈顶开始向下循环,依次打印栈内数据{printf("%d ",p->data[i]);}printf("\n");
}int main(int argc, char const *argv[])
{stack_t *S = Create(5);//开辟空顺序栈Push(S, 5);//调用入栈函数Push(S, 4);Push(S, 3);Push(S, 2);Push(S, 1);printf("出栈: ");Pop(S, S->top);//调用出栈函数, 出栈先进后出  1  2  3  4  5return 0;
}

 运行结果:

 

 2》链式栈

逻辑结构:线性结构

存储结构:链式存储

顺序栈和链式栈的区别:存储结构不同,实现的方式也不同,顺序栈是用顺序表实现而链式栈是用链表实现。

栈的操作:创空栈、入栈、出栈、判空

入栈:

 

 出栈:

 代码展示:

#include <stdio.h>
#include <stdlib.h>typedef int data_t;
typedef struct node
{data_t data;struct node *next;
} Node_t, *Node_p;/*创建一个空栈*/
void Create(Node_p *p) // Node_p 相当于Node_t *,所以 Node_p *p 相当于定义一个二级指针,接受一级指针的地址  p = &top
{*p = NULL; //*p = top = NULL;
}/*入栈*/
void Push(Node_p *p, int data)
{Node_p p_new = (Node_p)malloc(sizeof(Node_t)); // 开辟一个新的要入栈的节点if (NULL == p_new){perror("malloc lost\n");}p_new->data = data; // 新节点初始化p_new->next = *p;//让新节点连接到top栈顶上*p = p_new;//让top栈顶移动到新节点处,让新节点成为栈顶
}
/*判空*/
int Empty(Node_p p)
{return p == NULL;//当栈顶为空的时候,就是创空栈的时候
}/*出栈*/
void Pop(Node_p *p)
{if (Empty(*p))//判空,容错判断{perror("Empty\n");}while (*p != NULL)//当栈顶不是空,就进入循环{printf("%d ", (*p)->data);//先出栈顶的元素Node_p p_del = *p;//定义一个p_del指针指向栈顶*p = (*p)->next;//让栈顶向下移动,指向下一个节点free(p_del);//释放之前的栈顶节点p_del = NULL;//将p_del指针置空}printf("\n");
}/*栈的长度*/
int Length(Node_p p)
{int len = 0;//定义一个变量保存栈的长度while (p != NULL)//当栈顶元素不为空就进入循环{len++;//让栈的长度加一p = p->next;//栈顶指针向下移动,指向下一个节点}return len;//返回栈的长度
}int main(int argc, char const *argv[])
{Node_p top;//定义一个栈结构体类型的指针Create(&top); // top = NULL,创空栈,此时栈里只有一个控制真for (int i = 0; i < 5; i++)//循环调用入栈函数Push(&top, i);printf("栈的长度:%d\n", Length(top));//打印栈的长度printf("出栈: ");Pop(&top);//调用出栈函数,先入后出return 0;
}

运行结果:

 4》顺序栈的链式栈的区别

1> 顺序栈是顺序存储,内存连续,用顺序表实现;链表是链式存储,内存不连续,用链表实现。

2> 顺序栈的长度固定,而链栈不会。


今天的分享就到这里结束啦,如果有哪里写的不好的地方,请指正。
如果觉得不错并且对你有帮助的话请给个三连支持一下吧!

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

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

相关文章

仿照ContentLoadingProgressBar 的特点在Android项目中自定义Loading对话框

ContentLoadingProgressBar 是 Android 中的一个控件&#xff0c;继承自 ProgressBar。它在 ProgressBar 的基础上添加了一些特殊功能&#xff0c;主要用于在加载内容时显示进度。它的一些主要特点如下&#xff1a; 自动隐藏和显示&#xff1a;ContentLoadingProgressBar 会在…

JavaScript_7_练习:随机抽奖案例

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>练习&#xff1a;随机抽奖案例</tit…

vue项目配置基础路由vue-router

1、运行以下命令安装vue-router yarn add vue-router 2、在src目录下的components中新建两个vue页面 3、在src目录下新建router文件夹&#xff0c;在router文件夹下面新建index.js文件 4、配置main.js文件 //引入Vue import Vue from "vue"; //引入App import App…

全新分支版本!微软推出Windows 11 Canary Build 27686版

已经很久没有看到 Windows 11 全新的分支版本了&#xff0c;今天微软发布 Windows 11 Canary 新版本&#xff0c;此次版本号已经转移到 Build 27xxx&#xff0c;首发版本为 Build 27686 版。 此次更新带来了多项改进&#xff0c;包括 Windows Sandbox 沙盒功能切换到 Microsof…

LearnOpenGL——SSAO学习笔记

LearnOpenGL——SSAO学习笔记 SSAO一、基本概念二、样本缓冲三、法向半球四、随机核心转动五、SSAO着色器六、环境遮蔽模糊七、应用SSAO遮蔽因子 SSAO 一、基本概念 环境光照是我们加入场景总体光照中的一个固定光照常量&#xff0c;它被用来模拟光的散射(Scattering)。散射应…

QT事件机制理解

事件和信号 从硬件层来看: 事件就是一种中断&#xff0c; 中断的产生形式: 1.用户操控硬件所产生的中断。 2.由系统自身所产生的中断&#xff0c;比如说定时器。 这种中断由系统内核监控&#xff0c;由系统内核接收到中断并向CPU发出的执行请求就叫信号。所以说事件是信号产生…

C++,std::bind 详解

文章目录 1. 概述2. 基本用法2.1 使用占位符2.2 示例 3. 总结 1. 概述 std::bind 是 C11 引入的一个功能&#xff0c;它允许你将函数&#xff08;或成员函数、函数对象&#xff09;与其参数绑定&#xff0c;生成一个新的可调用对象。这个功能在需要将函数及其参数一起传递给其…

[OC]萝卜圈玩行车记录仪

图1-1&#xff0c;你的手动小车 代码是 #机器人驱动主程序 #请在main中编写您自己的机器人驱动代码 import tkinter as tk import turtle v0 # 速度 accFalse;slowFalse;leftFalse;rightFalse # 按键状态 step0.5 # 一次速度变化量 def keyup_press(event):global acc;accTru…

正点原子linux开发板 qt程序交叉编译执行

1.开发板光盘 A-基础资料->5、开发工具->1、交叉编译器->fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh 拷贝到 Ubuntu 虚拟机 用文件传输系统或者共享文件夹传输到linux虚拟机 用ls -l查看权限&#xff0c;如果是白色的使…

保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)

经历上一篇《零基础小白实现C#调用halcon dll的过程&#xff0c;并测试程序证明C#halcon联合开发成功》的发布已经过去三天啦&#xff0c; 零基础小白实现C#调用halcon dll的过程&#xff0c;并测试程序证明C#halcon联合开发成功-CSDN博客 在友友的催更下&#xff0c;我将用我…

rabbitmq镜像集群搭建

用到的ip地址 ip地址端口192.168.101.65&#xff08;主&#xff09;15672192.168.101.7515672192.168.101.8515672 安装erlang和rabbitmq 安装 安装三个包 yum install esl-erlang_23.0-1_centos_7_amd64.rpm -y yum install esl-erlang-compat-18.1-1.noarch.rpm -y rpm -…

探索CompletableFuture:高效异步编程的利器

目录 一、CompletableFuture基本功能安利 二、CompletableFuture使用介绍 &#xff08;一&#xff09;任务创建使用 1.supplyAsync创建带有返回值的异步任务 2.runAsync创建没有返回值的异步任务 &#xff08;二&#xff09;异步回调使用 1.异步回调&#xff1a;thenApp…

基于Sringboot+Vue个人驾校预约管理系统--论文pf

TOC springboot503基于SringbootVue个人驾校预约管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。…

XSS-games

XSS 1.XSS 漏洞简介2.XSS的原理3.XSS的攻击方式4.XSS-GAMESMa SpaghetJefffUgandan KnucklesRicardo MilosAh Thats HawtLigmaMafiaOk, BoomerWW3svg 1.XSS 漏洞简介 ​ XSS又叫CSS&#xff08;Cross Site Script&#xff09;跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Sc…

Nginx服务器申请及配置免费SSL证书

免费SSL证书申请 背景&#xff1a; 我的情况是这样&#xff0c;域名解析是华为云的&#xff0c;然后免费证书在腾讯云申请。但是大致的配置流程都是一样的 在腾讯云平台申请免费的SSL证明(目前有效期是90天)&#xff0c;申请步骤如下 主要步骤说明 申请免费SSL证书根据申请时说…

对商品评论进行文本分析(NLP)的实战项目

文本分析技术是指使用计算机程序或算法处理、分析和理解文本数据的一系列方法。这种技术在自然语言处理&#xff08;NLP&#xff09;领域中非常重要&#xff0c;它可以应用于多种场景&#xff0c;包括但不限于情感分析、主题识别、信息提取、文本分类等。以下是一些常见的文本分…

如何在本地和远程删除 Git 分支?

如何在本地和远程删除 Git 分支&#xff1f; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉城市开发者社区主理人 擅长.n…

江西学术会议:第五届计算机、大数据与人工智能国际会议

第五届计算机、大数据与人工智能国际会议(ICCBDAI 2024)将于2024年11月1日-3日在江西景德镇召开。本届会议由景德镇陶瓷大学主办&#xff0c;西安交通大学、暨南大学、南京邮电大学、景德镇学院、ELSP&#xff08;爱迩思出版社&#xff09;、ESBK国际学术交流中心、AC学术平台协…

Transformer模型中的Position Embedding实现

引言 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;Transformer模型自2017年提出以来&#xff0c;已成为许多任务的基础架构&#xff0c;包括机器翻译、文本摘要和问答系统等。Transformer模型的核心之一是其处理序列数据的能力&#xff0c;而Position Embedding在…

你是如何克服编程学习中的挫折感的?(-@-^-0-)

在编程学习中遇到挫折感是极为常见且正常的现象&#xff0c;因为编程往往涉及解决复杂问题、理解抽象概念以及不断试错的过程。 以下是一些建议&#xff0c;帮助你在面对挫折时调整心态&#xff0c;继续前行&#xff1a; 接受失败是成长的一部分&#xff1a;首先要认识到&#…