Stack

文章目录

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

定义

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


在这里插入图片描述


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

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

分类

静态栈

以数组为最基本的内核。

动态栈

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

算法

压栈和出栈。
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.mfbz.cn/a/48005.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Sentinel针对IP限流

改造限流策略的针对来源选项 import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.RequestOriginParser; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;Configuration public class Senti…

每日一题——除自身以外数组的乘积

除自身以外数组的乘积 题目链接 这一题乍一看好像十分简单&#xff0c;先用一趟循环遍历所有数据&#xff0c;得到数据所有元素的乘积&#xff0c;再用一趟循环将这个乘积除以每个元素&#xff0c;这样不就得到了除自身以外数组的乘积吗&#xff1f;我们先来看看代码&#xff…

【iOS】isKindOfClass和isMemberOfClass方法

前言 这个归根结底还是在考察我们对isa走向图和类的继承的理解&#xff0c;也就是苹果官方这幅图&#xff1a; 接下来的函数调用流程请参考这张图。 1 isKindOfClass方法 1.1 objc_opt_isKindOfClass C函数 查看源码可发现&#xff0c;无论是谁调用isKindOfClass方法都会…

了解Unity编辑器之组件篇Event(七)

Event&#xff1a;用于在对象之间进行通信和交互的机制。它可以帮助你实现触发和响应特定动作或状态的逻辑一、Event System&#xff1a;用于处理 UI 事件的系统组件 First Selected 属性&#xff1a;定义了在场景加载或 UI 激活时&#xff0c;哪个 UI 元素将成为首选的选中元素…

Kotlin多平台最佳架构指南

在这篇文章中&#xff0c;我们将对 Kotlin 多平台移动端的最佳架构进行深入探讨。在2023年&#xff0c;作为 Android 开发者&#xff0c;我们会倾向于采用 MVVM 架构&#xff0c;因为它简单、灵活且易于测试。而作为 iOS 开发者&#xff0c;我们可能会选择 MVC、Viper 等架构。…

win11安装appium

node安装 node下载网址: Download | Node.js 安装后对node安装包路径进行配置 npm config set prefix “E:\nodejs\node_global” //设置全局包目录 npm config set cache “E:\nodejs\node_cache” //设置缓存目录npm config list //查看npm配置npm install -g appium //安…

Windows SMB 共享文件夹 排错指南

1 排错可能 是否系统名称为全英文格式 如果不是则 重命名 根据如下排错可能依次设置 1&#xff0c;在运行里面输入"secpol.msc"来启动本地安全设置&#xff0c;\ 然后选择本地策略–>安全选项 -->网络安全LAN 管理器身份验证级别&#xff0c;\ “安全设置”…

C#实现数字验证码

开发环境&#xff1a;VS2019&#xff0c;.NET Core 3.1&#xff0c;ASP.NET Core API 1、建立一个验证码控制器 新建两个方法Create和Check&#xff0c;Create用于创建验证码&#xff0c;Check用于验证它是否有效。 声明一个静态类变量存放列表&#xff0c;列表中存放包含令…

如何维护你的电脑:提升性能和延长使用寿命

如何维护你的电脑&#xff1a;提升性能和延长使用寿命 &#x1f607;博主简介&#xff1a;我是一名正在攻读研究生学位的人工智能专业学生&#xff0c;我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑&#xff0c;欢迎随时来交流哦&…

【深度学习】从现代C++中的开始:卷积

一、说明 在上一个故事中&#xff0c;我们介绍了机器学习的一些最相关的编码方面&#xff0c;例如 functional 规划、矢量化和线性代数规划。 本文&#xff0c;让我们通过使用 2D 卷积实现实际编码深度学习模型来开始我们的道路。让我们开始吧。 二、关于本系列 我们将学习如何…

【Unity实用插件篇】| A* Pathfinding Project - A*寻路插件 的使用教程

前言【Unity实用插件篇】| A*寻路插件学习使用一、A*算法 简述二、A* Pathfinding Project 介绍2.1 A* Pathfinding Project 功能2.2 相关链接2.3 标准版和Pro版区别2.4 A* Pathfinding Project Free与Navigation的对比三、快速搭建一个自己的场景测试寻路3.1 寻路场景搭建3.2 …

python绘制3D条形图

文章目录 数据导入三维条形图bar3d 数据导入 尽管在matplotlib支持在一个坐标系中绘制多组条形图&#xff0c;效果如下 其中&#xff0c;蓝色表示中国&#xff0c;橘色表示美国&#xff0c;绿色表示欧盟。从这个图就可以非常直观地看出&#xff0c;三者自2018到2022年的GDP变化…

python使用CGI编程,网页写个标题

需要有个 Linux虚拟机&#xff0c;安装 apache&#xff0c; 本次使用 deepin v23&#xff0c;参考&#xff1a; sudo apt install apache2 #安装 apache2 systemctl start apache2 # 启动 apache2 sudo a2enmod cgi # 启用CGI模块 sudo mkdir /usr/lib/cgi-bin #创…

初识Mybatis,并创建第一个Mybatis项目(详细图文教程)

目录 前言 一、Mybatis是什么&#xff1f; 二、Mybatis的优点 三、创建第一个Mybatis项目 配置Mybatis开发环境 创建数据库 添加框架 配置连接字符串和Mybatis 使用Mybatis操作数据库 测试 前言 Spring 集成了 Mybatis 框架&#xff0c;方便我们更加便捷的使用&#…

关于自签名证书授权后在哪儿看

目录 firefox可以看到 chrome and edge firefox可以看到 chrome and edge 只能从打开的网站左上角进入

【数据结构】--八大排序算法【完整版】

匠心制作&#xff0c;后续有问题会加以修改的 &#xff0c;全文均是自己写的&#xff0c;几张图有参考网络 ———————————————— 目录 一、直接插入排序 二、希尔排序(直接插入排序的改良版) 三、选择排序&#xff08;直接选择排序&#xff09; 四、堆排序 …

前端实现导出excel表格(单行表头)

需求&#xff1a;实现勾选行导出为表格 一、安装插件 npm install --save file-saver xlsx运行项目报如下警告的话 运行npm install xlsx0.16.0 --save 来降低版本号&#xff08;最初我安装的版本号是0.18.16的版本&#xff09;再次运行项目就不会报如下警告了 二、新建一个ex…

SQL与NoSQL数据库选型及实际业务场景探讨

在企业系统架构设计中&#xff0c;选择合适的数据库类型是一项关键决策。本文将对比SQL和NoSQL数据库的特点&#xff0c;分析它们在数据模型、可扩展性、一致性与事务、查询复杂性与频率&#xff0c;以及性能与延迟等方面的优势和劣势。同时&#xff0c;结合轻易云数据集成平台…

系统学习Linux-MySQL用户权限管理(三)

一、用户权限管理概述 数据库用户权限管理是数据库系统中非常重要的一个方面&#xff0c;它用于控制不同用户访问和操作数据库的权限范围。数据库用户权限管理可以保护敏感数据和数据库结构&#xff0c;确保只有被授权的用户才可以操作和使用数据库&#xff0c;防止数据被修改…

Unity游戏源码分享-街机捕鱼2017版本

Unity游戏源码分享-街机捕鱼2017版本 完整的单机游戏 功能玩法&#xff0c;积分系统都已经齐全的了。 项目源码地址&#xff1a;https://download.csdn.net/download/Highning0007/88105459
最新文章