从0开始的(c语言)数据结构学习 3:栈

2023-11-16

注:本文以造轮子为主,属于相对理论性、教学性的东西

在实际使用中,如果你是c++,请直接 #include < stack > !!!!!!!

理解:什么是栈?

你现在有一个放网球的竖球筒,每次你放进去的球都会放在最上面,同理,当你要取出来一个球的时候,也只能取出来最上面的球。

在这里插入图片描述

栈就是相同的道理,它遵从先进后出后进先出的原则。

对于这个球筒,我们有以下几个常用的方法:

  1. 初始化(创建一个球筒)
  2. 入栈(在球筒顶部塞一个球进去)
  3. 出栈(在球筒顶部拿一个球出来)
  4. 取栈顶(看看球筒顶部的球的值,请分清和出栈的关系)

(本质上只有这四个操作,你也可以做一些类似清空栈的操作)
(注:本文为链栈,你也可以以顺序的方式尝试实现栈)

具体代码

注:本代码没有包含main函数(我在其中加入了一些很具体的注释来帮助理解,如果喜欢读代码的朋友可以直接看)
注2:如果你不想纯粹读代码,该代码所有的具体解释请下移

#include<iostream>
#include<fstream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;

typedef struct StackNode {
	SElemType data;//链栈的数据域
	struct StackNode *next;//指针域
} StackNode, *LinkStack;


Status InitStack(LinkStack &S)//初始化栈
{ 
	S = NULL;//简单吗?
	return OK;
}

Status Push(LinkStack &S, SElemType e) //入栈:在栈S顶部插入元素e,在这里SELemType是char
{
	LinkStack p;
	p = new StackNode; //为要加入的结点new空间
	p->data = e; //新结点数据域e
	p->next = S; //将新结点插入栈顶
	S = p; //修改栈顶指针为p
	return OK;
}

Status Pop(LinkStack &S, SElemType &e) //出栈:删除S的栈顶元素,用e返回其值
{
	LinkStack p;
	if (S == NULL)return ERROR; //判断栈是不是空的
	e = S->data; //获得栈顶元素e
	p = S; //保存当前栈顶元素到p,用于之后的释放
	S = S->next; //修改栈顶指针
	delete p; //释放
	return OK;
}

SElemType GetTop(LinkStack S) //取栈顶值,不删除栈顶
{
	if (S != NULL) return S->data; //如果栈此时不为空,就返回栈顶元素
}

对于代码的具体解释

1,前设_宏定义

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;

和之前的宏定义几乎没有区别,最多就改了个别称SElemType.

2,前设_结构

typedef struct StackNode {
	SElemType data;//链栈的数据域
	struct StackNode *next;//指针域
} StackNode, *LinkStack;

由于我们使用的是链栈,本质上和链表差不多。同理这里的数据域可以换为结构,在面向对象中可以改为类。但在实际使用中请直接include stack

3,函数_初始化

Status InitStack(LinkStack &S)
{ 
	S = NULL;
	return OK;
}

简单吗?

4,函数_入栈

Status Push(LinkStack &S, SElemType e)
{
	LinkStack p;
	p = new StackNode; 
	p->data = e;
	p->next = S;
	S = p;
	return OK;
}
【作用解释】

在链栈顶部插入新的结点e

思路:
  1. 为新的结点开个空间
	LinkStack p;
	p = new StackNode; 
  1. 把新的结点放到球筒的顶部
    p->data = e;
  2. 使新的结点作为栈的顶部
	p->next = S;
	S = p;

在这里,p的next为S,意思是最上面的球,永远是第一个,我们取的时候也是先取它。这样来写就能符合先出后进,先进后出的原则了。

5,函数_出栈

Status Pop(LinkStack &S, SElemType &e)
{
	LinkStack p;
	if (S == NULL)return ERROR; 
	e = S->data; 
	p = S; 
	S = S->next; 
	delete p;
	return OK;
}
【作用解释】

将链栈顶部的结点输出到e并删去。

思路:
  1. 判断栈是不是空,如果栈已经空了,我们也就没法从球筒里往外拿球了,此时返回ERROR
    if (S == NULL)return ERROR;
  2. 拿一个球出来
    e = S->data;
  3. 现在栈顶是刚刚拿走的球的下一个球了。
    p = S; S = S->next;
  4. 删除我们已经拿走的球占用的空间。
    delete p;

6,函数_取栈顶值

SElemType GetTop(LinkStack S)
{
	if (S != NULL) return S->data; 
}

判断是不是空,不是空就输出栈顶的数据域就好了。(S就是栈顶)

如果你是初学者:

没什么要实现的了,去力扣或者洛谷什么的刷刷题吧。

如果你想要没有注释的代码:

拿走,请。

#include<iostream>
#include<fstream>
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef char SElemType;

typedef struct StackNode {
	SElemType data;
	struct StackNode *next;
} StackNode, *LinkStack;

Status InitStack(LinkStack &S)
{ 
	S = NULL;
	return OK;
}
Status Push(LinkStack &S, SElemType e) 
{
	LinkStack p;
	p = new StackNode;
	p->data = e;
	p->next = S;
	S = p;
	return OK;
}
Status Pop(LinkStack &S, SElemType &e)
{
	LinkStack p;
	if (S == NULL)return ERROR;
	e = S->data;
	p = S;
	S = S->next;
	delete p;
	return OK;
}
SElemType GetTop(LinkStack S)
{
	if (S != NULL) return S->data;
}
int main()
{
	return 0;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从0开始的(c语言)数据结构学习 3:栈 的相关文章

  • 02-Node.js—Buffer(缓冲器)

    文章目录 1 概念 2 特点 3 创建Buffer 3 1 Buffer alloc 3 2 Buffer allocUnsafe 3 3 Buffer from 4 操作Buffer 4 1 Buffer 与字符串的转化 4 2 Buff
  • H264实时编码及NALU,RTP传输

    原文引用地址 http wmnmtm blog 163 com blog static 382457142011920102618122 fromdm fromSearch isFromSearchEngine yes H264实时编码及N
  • linux中find命令详解,Linux下的find指令详解

    在Linux下有很多查找指令 locate whereis which find 在这些查找指令中功能最强大的当属find指令了 find命令在目录结构中搜索文件 并执行指定的操作 Linux下find命令提供了相当多的查找条件 功能很强大
  • linux shell数据重定向(输入重定向与输出重定向)详细分析

    在了解重定向之前 我们先来看看linux 的文件描述符 linux文件描述符 可以理解为linux跟踪打开文件 而分配的一个数字 这个数字有点类似c语言操作文件时候的句柄 通过句柄就可以实现文件的读写操作 用户可以自定义文件描述符范围是 3
  • Vue计算属性:简化数据处理和视图更新的利器

    一 计算属性的基本使用 计算属性 一个特殊属性 值依赖于另外一些数据动态计算出来 计算属性特点 函数内使用的变量改变 重新计算结果返回 注意 计算属性必须定义在computed节点中 计算属性必须是一个function 计算属性必须有返回值

随机推荐

  • 基于STM32通过RTC唤醒低功耗模式

    一 低功耗模式 1 简介 通俗的来讲低功耗模式就是降低单片机的运行功耗 STM32F10xxx有三种低功耗模式 1 睡眠模式 Cortex M3 内核停止 所有外设包括 Cortex M3 核心的外设 如 NVIC 系统时 钟 SysTic
  • 解决Go-CQhttp无法登录(服务器如何登录)的问题

    既然你能看到这篇帖子 说明你一定对这个东西不陌生了 这是某讯的登录检查机制 解决方法 也很简单 保证手机与电脑处于同一wifi以内 那这时候有人叫要问了 可是我明明开了wifi 为什么还是登陆不了呢 麻烦你不要一边开wifi一边开数据 别问
  • 大数据技术炙手可热 专业人才短缺成发展掣肘

    大数据技术炙手可热 专业人才短缺成发展掣肘 2011 11 25 09 29 1765次阅读 已有0条评论 发表评论 来源 CSDN编译 作者 李智 收藏到我的网摘 导读 尽管还存在安全等问题 但Hadoop已经为部署在大企业中的大型项目做
  • 防止内存泄露 Linux下用Valgrind做检查

    用C C 开发其中最令人头疼的一个问题就是内存管理 有时候为了查找一个内存泄漏或者一个内存访问越界 需要要花上好几天时间 如果有一款工具能够帮助我们做这件事情就好了 valgrind正好就是这样的一款工具 Valgrind是一款基于模拟li
  • 数据建模,ODS模型分析

    根据ODS系统解决的不同的数据问题 将ODS模型将数据按三层进行管理 分别针对细节级数据 汇总型数据和分析型数据 每个区域有自己的管理重点 下面分别介绍 基础数据层 FDM FOUNDATION DATA MODLE 来源于标准化的各源系统
  • 计算机视觉基础:自适应阈值分割(Computer Vision Fundamentals: Adaptive Threshold Segmentation)

    前言 阈值分割方法虽然简单 但是如果场景简单 还是可以尝试使用的 因为其消耗的时间较少 同时 也可以作为一个baseline来验证提出的新算法是否有效 对于阈值分割 我们认为没有理由讲了 这里主要介绍两种自适应阈值分割方法 实际工程应用过程
  • 3dmax出现白屏解决方法

    3DMax 卡死 白屏 渲染死机问题总结 Deveuper的博客 CSDN博客 3dmax一渲染完就卡死 修改设置
  • 区块链技术的创新周期在不断缩短吗?

    有业内人士指出 区块链技术的发展可能要经过高峰 低谷和平复的过程 这也对金融监管部门提出了挑战 要在鼓励金融创新和防范风险之间找到平衡 从有利因素来看 区块链技术的创新周期在不断缩短 据介绍 金融科技定义是指技术驱动的金融创新 包括新业务模
  • 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 II 从上到下打印二叉树 II 题目 题目链接 解题思路 具体思路 具体代码 题目 题目链接 https leetcode cn com problems cong shang dao xia da yin er c
  • vue父子组件在不同情况下生命周期的执行顺序

    在分析父子组件生命周期之前 我们先核实一次两个路由 不包含子组件 之间切换 其生命周期的执行顺序 在这用到两个路由 新闻路由和top路由 名字只做区分 没有其他含义 1 首先切换到新闻路由 执行顺序 beforeCreate gt crea
  • PHP下载m3u8,合并视频

    主要使用CURL获取请求 代码 将代码保存为m3u8 download php 然后执行 如果下载速度比较慢 要把Curl的超时时间设置长一点 防止出现超时丢数据 c gt php m3u8 download php u http xxx
  • 【构建ML驱动的应用程序】第 11 章 :监控和更新模型

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • C++ char* 的若干问题之一

    已有方法 十进制转二进制 char decimal2binary int numth string key bitset lt 4 gt t t numth key t to string char ch const cast
  • Arthas开源一周年,Github Star 16K,我们一直在坚持什么?

    缘起 最近看到一个很流行的标题 开源XX年 star XXX 我是如何坚持的 看到这样的标题 忽然发觉Arthas从2018年9月开源以来 刚好一年了 正好在这个秋高气爽的时节做下总结和回顾 Arthas是Alibaba开源的Java诊断工
  • UKN服务器找不到,在windows下用ppk后缀文件登陆远程服务器

    最近要部署一个项目到服务器上 对方给我生成了一个以ppk为后缀名的密钥 让我直接登陆 这里记录一下过程 用putty通过ssh登陆服务器 下载putty 貌似官网上不了 我是在这里下载的 下载putty exe 不用安装 连接服务器 打开p
  • 安装深度(Deepin)系统

    Deepin系统安装 Deepin是和Ubuntu一样 是一个基于Debian的Linux的发型版本 Deepin相对于Ubuntu Deepin更适合中国用户的使用习惯 一 官网工具制作启动盘 制作启动盘 和安装系统 操作非常简单 nic
  • 计算机文化基础成绩,计算机文化基础成绩评定办法

    计算机文化基础 成绩评定办法 本次 计算机文化基础 的最终总评成绩由平时成绩和期末成绩两部分组成 其中平时成绩满分100分 其中考勤占20分 平时作业占80分 占总评的40 期末成绩满分100分 占总评的60 包括学生的Office软件操作
  • 超棒的JS/CSS动画效果网站——持续搜集

    Animate css 这里有超多的纯CSS小动画 代码清晰 作为学习的代码也很不错 地址 https daneden github io animate css CodePen 这里展示了超多优秀 特别 富有创意的前端效果 简直就是一个宝
  • Qt缺少Mysq驱动QMYSQL driver not loaded

    如果Qt在指定Mysql驱动时 报了这样的错说明缺少mysql相关的动态链接库 QSqlDatabase QMYSQL driver not loaded QSqlDatabase available drivers QSQLITE QOD
  • 从0开始的(c语言)数据结构学习 3:栈

    注 本文以造轮子为主 属于相对理论性 教学性的东西 在实际使用中 如果你是c 请直接 include lt stack gt 理解 什么是栈 你现在有一个放网球的竖球筒 每次你放进去的球都会放在最上面 同理 当你要取出来一个球的时候 也只能