Stack

news2024/9/29 23:37:11

文章目录

  • 定义
  • 分类
    • 静态栈
    • 动态栈
  • 算法
  • 应用

定义

在静态内存当中分配的叫做栈,在动态内存中分配的叫做堆。


在这里插入图片描述


**红色椭圆圈当中的就是在栈中分配的,蓝色下划线的就是在堆里分配的。**栈和堆表示的是分配数据的一种方式。静态局部变量是通过压栈和出栈来分配内存的,而动态变量是通过堆排序的方式来分配内存。

所以,栈是一种可以实现“先进后出”的存储结构,栈类似于箱子(有底)。

分类

静态栈

以数组为最基本的内核。

动态栈

不连续,其内核是链表(不允许尾部插入尾部删除)。最常用的是动态栈。

算法

压栈和出栈。
push&pop

#include <iostream>
#include <cmalloc>
#include <cstdlib>

using namespace std;

typedef struct Node
{
	int data;
	struct Node * pNext;
}NODE, *PNODE;

typedef struct Stack
{
	PNODE pTop;//栈顶
	PNODE pBottom;//栈底
}STACK, *PSTACK;

//因为栈也是链表演化过来的,对于栈来说,其栈底就相当于链表的头结点,栈底上方一个元素就是第一个有效节点。

//初始化
void init(PSTACK);
void push(PSTACK, int);
void traverse(PSTACK);
bool pop(PSTACK, int);


int main(void){
	STACK S;
	//这样就生成一个栈了,里面有两个元素,一个pTop一个pBottom。
	init(&S);
	//初始化就是使得pTop以及pBottom指向同一个头结点,(链表)即可生成一个空栈。
	//注意的是,压栈的时候无需指定位置,因为只能放在栈顶。
	push(&S, 1);//压栈后,这个结点就相当于pBottom了,之后它指向下方的头结点
	push(&S, 2);//pTop需要根据压栈而随时变化。
	traverse(&S);//遍历
	pop(&S, &val);
	
	return 0;
}

//初始化,造空栈
void init (PSTACK pS)
{	//现在就是要使得pTop以及pBottom都指向一个没有实际含义的,也就是pBottom下一个的结点,类似链表当中的头结点。
	pS->pTop = (PNODE)malloc(sizeof(NODE));
	if (pS->pTop == nullptr)
	{
		cout << "动态内存分配失败!" << endl;
		return -1;
	}
	else
	{
		pS->pBottom = pS->pTop;
		pS->pTop->pNext = nullptr;//把pBottom指向的下一个结点的指针域清空,这里的pTop换成pBottom是一样的,因为现在这两个都指向了pBottom的下一个结点。
	}
}

//压栈
void push(PSTACK pS, int val)
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));
	pNew->data = val;
	pNew->pNext = pS->pTop;//每次压栈都放到栈顶的上方,这里只能写pTop。
	pS->pTop = pNew;//这样新的节点就是栈顶了,每次压栈,新的节点都是栈顶。	
}

//遍历
void traverse(PSTACK)
{
	//定义指针p,永远指向栈顶元素。
	PNODE p = pS->pTop;
	while(p != pS->pBottom)
	{
		cout << p->data << '\n' << endl;
		p = p->pNext;
	}
	return;
}

//判断是否为空栈
bool empty(PSTACK pS)
{
	if(pS->pTop == pS->pBottom)
		return true;
	else
		return false;
}

//把pS嗦指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,出栈成功返回true。
bool pop(PSTACK pS, int *pVal)
{
	if (empty(pS))//pS本身就是S的地址
		return false;
	else
	{
		PNODE r = pS->pTop;
		*pVal = r->data;
		pS->pTop = r->pNext;
		free(r);
		r = nullptr;
		return true;
	}
}

void clear()
//清空,一个一个释放
//定义两个指针,一个p一个q,q指向p的下一个元素
//如果把p给free掉,那么q还是能指向下一个元素,这时候只要把q赋值给p,然后q再向下移一个,只要p指向的不是bottom,都能成立。
{
	if (empty(pS))
	{
		return;
	}
	else
	{
		PNODE p = pS->pTop;
		PNODE q = nullptr;
		while (p != pS->pBottom)
		{	
			q = p->pNext;
			free(p);
			p = q;
		}
		pS->pTop = pS->pBottom;
	}
}

初始化后的栈:
在这里插入图片描述
push的操作
在这里插入图片描述

在这里插入图片描述
判断栈是否为空,则看pTop与pBottom是否相等。

应用

  • 函数调用
  • 中断
  • 表达式求值
  • 内存分配
  • 缓冲处理
  • 迷宫

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

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

相关文章

网络安全行业相关证书

一&#xff1a;前言 对于考证这个话题&#xff0c;笔者的意见是&#xff1a;“有比没有好&#xff0c;有一定更好&#xff0c;但不一定必须&#xff1b;纸上证明终觉浅&#xff0c;安全还得实力行”。很多人对于各种机构的考证宣传搞得是云里雾里&#xff0c;不知道网络安全行业…

【Java练习题汇总】《第一行代码JAVA》网络编程篇集合体系篇,汇总Java练习题——Socket 与ServerSocket、List和Set、Map~

Java练习题 网络编程篇&集合体系篇 1️⃣ 网络编程篇&集合体系篇 1️⃣ 网络编程篇&集合体系篇 一、填空题 在类集中存放单值的最大父接口是___________ &#xff0c;存放一对值的最大父接口是___________ 。___________ 接口保存的数据是不允许重复的&#xff…

c语言复合赋值符和运算符的优先级问题

结论&#xff1a; 复合赋值符的优先级小于运算符 【练习1】 a * a / b的运算顺序是什么&#xff1f; a / b * a 【练习2】 x / 3 2 * 3 2 / 3 6 2 x 0

使用os库操作目录和文件

1. 获取本机操作系统的分隔符 # 导入os库 import os # 获取本机操作系统的分隔符 print(os.sep) 2. 获取本机操作系统的类型 如果是windows&#xff0c;是nt。 # 导入os库 import os # 获取本机操作系统的类型 print(os.name) 3. 获取当前的工作目录路径 # 导入os库 import…

RL vs 最优控制:用于轨迹跟踪的 LQR(使用 Python 代码)

一、说明 在本博客系列中&#xff0c;我们将了解最优控制的经典方法&#xff0c;这些方法在某种程度上为强化学习等更熟悉的主题奠定了坚实的基础。这两个领域之间存在着不可避免的共同边界&#xff0c;本系列旨在提出这些最优控制的形式化方法&#xff0c;作为强化学习方法的有…

[内网渗透]SUID提权

文章目录 [内网渗透]SUID提权0x01.什么是SUID&#xff1f;0x02.如何设置SUID&#xff1f;0x03.查找属主为root的SUID文件0x04.进行SUID提权1.find提权2.vim/vi/vim.tiny 以root权限修改文件3.bash提权4.less/more执行系统命令5.nano以root权限修改文件6.awk执行系统命令7.cp以r…

CHD6.2.1集群 Hive开启Iceberg

下载jar包 https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-runtime/1.0.0/iceberg-hive-runtime-1.0.0.jar 存放在/opt/cloudera/parcels/CDH/lib/hive/auxlib/ CDH集群修改hive配置 选择xml格式 粘贴即可 <property><name>iceberg.engine.hi…

QT: 完成服务器的实现

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…

小狐狸ChatGPT付费创作系统V2.1.4独立版 +WEB端+ H5端 + 小程序端(新增关注自动回复)系统搭建安装教程

PCu央小狐狸ChatGPT付费创作系统V2.1.4提供最新的对应版本小程序端&#xff0c;播播资源测试相比上几版本增加了关注公众号自动回复、扫码登陆自动回复功能&#xff0c;优化了部分细节。本版小程序端对应最新的2.1.4小程序前端。绘画功能建议采用其他绘画接口-意间AI&#xff0…

Python入门【变量的作用域(全局变量和局部变量)、参数的传递、浅拷贝和深拷贝、参数的几种类型 】(十一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

nbcio-boot项目把springboot从2.3.5.RELEASE升级到2.7.10和mybatis-plus升级到最新的3.5.3.1的问题解决记录

考虑到原先版本比较老&#xff0c;今天把springboot从2.3.5.RELEASE升级到2.6.6和mybatis-plus升级到最新的3.5.3.1。 编译出现下面的问题 用参数 -e -X clean package后打印出更多的出错日志信息 at org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering.filter…

大数据未来的前景怎么样?_光点科技

随着科技的迅猛发展和互联网的普及&#xff0c;大数据已成为当今社会中不可或缺的重要资源。大数据是指庞大而复杂的数据集合&#xff0c;这些数据通过高级计算技术进行处理和分析&#xff0c;可以揭示出有价值的信息和趋势。在过去几年中&#xff0c;大数据已经在各行各业产生…

迁移学习、微调、计算机视觉理论(第十一次组会ppt)

@TOC 数据增广 迁移学习 微调 目标检测和边界框 区域卷积神经网络R—CNN

pyspark笔记:读取 处理csv文件 (pyspark DataFrame)

pyspark cmd上的命令 1 读取文件 1.1 基本读取方式 注意读取出来的格式是Pyspark DataFrame&#xff0c;不是DataFrame&#xff0c;所以一些操作上是有区别的 1.1.1 format DataFrame spark.read.format("csv").option(name,value).load(path) format表示读取…

基于飞桨paddle的卷积神经网络构建手写数字识别模型测试代码

基于飞桨paddle的优化的卷积神经网络构建手写数字识别模型测试代码 原始测试图片为255X252的图片 采用的是多层卷积神经网络实现模型 本次预测的数字是: 0 预测结果正确 测试结果&#xff1a; PS E:\project\python> & D:/Python39/python.exe e:/project/python/MNIST…

如何用Python统计CSDN质量分

文章目录 CSDN质量分查询selenium爬取博客地址单篇测试批量查询分析 CSDN质量分查询 CSDN对博客有一套分数评价标准&#xff0c;其查询入口在这里&#xff1a;质量分查询&#xff0c;效果大致如下 如果质量分太低&#xff0c;就会在博文的标题下面出现黄底黄字&#xff1a; 这…

华为OD机试真题 Java 实现【数字涂色】【2022Q4 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

程序员,必须要知道的热门开源项目!

&#x1f3c6; 文章目标&#xff1a;了解热门开源项目 &#x1f340; 入门篇&#xff1a;程序员,必须要知道的热门开源项目! ✅ 创作者&#xff1a;熊猫Jay ✨ 个人公众号: 熊猫Jay字节之旅 (文末有链接) &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c;请帮…

使用easyexcel实现复杂excel表格导出

1、问题描述 最近在做一个自动化开发票的需求&#xff0c;就是把网页预览的发票导出成一个excel文件。其实这个很好实现&#xff0c;就是使用blob就可以实现把网页的html内容导出成一个.xls的文件就行了。 Blob把html导出为excel文件_blob导入导出excel_金斗潼关的博客-CSDN博…

【我们一起60天准备考研算法面试(大全)-第二十七天 27/60】【真分数】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…