C++实现栈的顺序存储与链式存储

2023-11-18

        栈是一种特殊的数据结构,栈中数据先进后出,且栈中数据只能从头部出栈,能直接访问的数据也仅为栈的头部数据,要想访问下面的数据则需要将前面的数据逐个出栈后才可访问。下面通过一个word撤销的案例来解释:

 

         我们用word写paper时,首先需要创建一个空白文档(即一个空栈),然后对这个空白文档进行一系列操作每个操作都是一个新的version,即数据存储压栈的操作。但是paper写完后(version4),我们发现写的paper有问题需要修改,想要回到version1,这就用到了撤销的操作。但是因为word只能直接访问最近的version,我们没法直接回到version1,需要先回到version3再回到version2最后才能回到version1,这种访问方式即出栈访问top。

        栈的基本理论就介绍到这,下面附上栈的两种存储结构的实现代码。

1、栈的顺序存储

#include <iostream>
using namespace std;
const int max_size=1024;
//创建栈
class seqstack
{
public:
	void* data[max_size];  //可以指向任何类型数据的指针
	int size;
};
//初始化栈
seqstack* init_seqstack()
{
	seqstack* stack =new seqstack;
	for (int i = 0; i < max_size; i++)
	{
		stack->data[i]=NULL;
	}
	stack->size=0;
	return stack;
}
//入栈操作
void push_seqstack(seqstack* stack,void* data)
{
	if (stack->size==max_size)
	{
		cout<<"数据已满"<<endl;
		return;
	}
	stack->data[stack->size]=data;
	stack->size++;
}
//返回栈顶元素
void* top_seq_stack(seqstack* stack)
{
	return stack->data[stack->size-1];
}
//出栈
void pop_seqstack(seqstack* stack)
{
	stack->data[stack->size-1]=NULL;
	stack->size--;
}
int main()
{
	//创建栈
	seqstack* stack=init_seqstack();
	//创建数据
	int num[9]={1,2,3,4,5,6,7,8,9};
	//数据入栈
	for (int i = 0; i < 9; i++)
	{
		cout<<"第"<<i+1<<"个入栈数据为:"<<num[i]<<endl;
		push_seqstack(stack,&num[i]);
	}
	cout<<endl;
	//逐个出栈并访问
	for (int i = 0; i < 9; i++)
	{
		cout<<"第"<<i+1<<"个出栈数据为:"<<*(int *)(top_seq_stack(stack))<<endl;  //将出栈的地址强转成int*再解指针
		pop_seqstack(stack);
	}
	system("pause");
	return 0;
}

运行结果为:

 2、栈的链式存储

#include <iostream>
#include <string>
using namespace std;
//节点
class linknode
{
public:
	linknode* next;
};
//自定义数据
class my_data
{
public:
	linknode* node;
	char data;
};
//链式栈
class linkstack
{
public:
	linknode head;
	int size;
};
//初始化栈
linkstack* init_linkstack()
{
	linkstack* stack=new linkstack;
	stack->head.next=NULL;
	stack->size=0;
	return stack;
}
//入栈
void push_linkstack(linkstack* stack,linknode* data)
{
	data->next=stack->head.next;
	stack->head.next=data;
	stack->size++;
}
//出栈
void pop_linkstack(linkstack* stack)
{
	stack->head.next=stack->head.next->next;
	stack->size--;
}
//返回栈顶元素
linknode* top_linkstack(linkstack* stack)
{
	return stack->head.next;
}

int main()
{
	//创建空栈
	linkstack* stack=init_linkstack();
	//创建数据
	string str="ABCDEFGHI";
	my_data data[9];
	for (int i = 0; i < str.size(); i++)
	{
		data[i].data=str[i];
		data[i].node=NULL;
	}
	//入栈
	for (int i = 0; i < str.size(); i++)
	{
		cout<<"第"<<i+1<<"个元素入栈:"<<str[i]<<endl;
		push_linkstack(stack,(linknode*)&data[i]);
	}
	cout<<endl;
	//出栈
	for (int i = 0; i < 9; i++)
	{
		cout<<"第"<<i+1<<"个元素出栈:"<<(((my_data*)top_linkstack(stack))->data)<<endl;
		pop_linkstack(stack);
	}
	system("pause");
	return 0;
}

运行结果为:

 如有错误的地方欢迎指正交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现栈的顺序存储与链式存储 的相关文章

  • 检查空参数的最佳方法(保护子句)

    例如 您通常不希望构造函数中的参数为空 因此看到类似的内容是很正常的 if someArg null throw new ArgumentNullException nameof someArg if otherArg null throw
  • SL4 AutoCompleteBox 重复筛选结果问题

    我在 AutoCompleteBox 过滤方面遇到问题 它似乎记住了之前的过滤器 例如 我输入 A 它会返回 1 项 我删除 A 并输入 Z 这应该返回 1 项 问题是它返回 A 过滤器加上 Z 的结果 我删除 Z 并输入 S 这会带回 2
  • C 中的变量定义是什么意思[重复]

    这个问题在这里已经有答案了 你们能告诉我 这在 C 中意味着什么吗 define Privileged Data Privileged Data static int dVariable 编译器对变量进行寻址有特殊意义吗 这只是一个宏Pri
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • SetWindowsHookEx 函数返回 NULL

    我正在研究 DLL 注入 但收到错误如下 挂接进程失败 87 参数不正确 目标进程和dll都是64位的 注入代码为 BOOL HookInjection TCHAR target TCHAR dll name https msdn micr
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • C# 中的协变和逆变

    首先我要说的是 我是一名正在学习 C 编程的 Java 开发人员 因此 我会将我所知道的与我正在学习的进行比较 我已经使用 C 泛型几个小时了 我已经能够在 C 中重现我在 Java 中知道的相同内容 除了几个使用协变和逆变的示例 我正在读
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • 将成员函数作为参数传递/c++

    我想用 C 实现一个类b可以通过封装该迭代器类型的成员集进行某种迭代 喜欢 b object for each x do function f so 函数 f会得到每个人的x成员并做任何事情 比方说 void function f x me
  • 特定设备的不同字体大小

    我目前正在开发通用应用程序 我需要分别处理移动设备和桌面的文本框字体大小 我找到了一些方法 但都不能解决问题 使用 VisualStateManager 和 StateTrigger 为例
  • 抽象类或接口。哪种方式是正确的?

    有两种方法可以选择抽象类或接口 微软解决方案和Oracle解决方案 微软 设计指南 请使用抽象 在 Visual Basic 中为 MustInherit 类而不是接口来将协定与实现分离 http msdn microsoft com en
  • 为什么重载方法在 ref 仅符合 CLS 方面有所不同

    公共语言规范对方法重载非常严格 仅允许根据其参数的数量和类型来重载方法 如果是泛型方法 则根据其泛型参数的数量进行重载 根据 csc 为什么此代码符合 CLS 无 CS3006 警告 using System assembly CLSCom
  • 如何不在类中实现接口的功能?

    面试时面试官问了我以下问题 但我不知道这个问题的答案是什么 请帮忙 如果我不想 我必须做什么 在我的类中实现一个函数 在接口中声明为 由我班实施 Edited 我正在使用 NET 和 C 如果有人可以提供 C 示例代码示例 那就太好了 Th
  • 当在 Repository/UnitOrWork 之上使用 Service 类时,我应该在哪里放置逻辑不适合 Repository 的常用数据访问代码?

    In my 先前的问题 https stackoverflow com questions 24906548 using the generic repository unit of work pattern in large projec
  • 无法通过 LINQ to Entities 使用某些功能?

    我正在尝试使用 LINQ 查询在项目上实现搜索功能 由于数据有时包含带有重音符号和其他符号的字符 因此我创建了一种方法来删除这些字符以进行搜索 这是我的代码 var addresses from a in db Addresses join
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • 将 bignum 类型结构转换为人类可读字符串的有效方法是什么?

    我有一点问题 为了增长我的 C 知识 我决定尝试实现一个基本的 bigint 库 bigint 结构的核心将是一个 32 位整数数组 选择它们是因为它们适合寄存器 这将允许我在数字之间进行操作 这些操作将在 64 位整数中溢出 这也将适合寄
  • 如何将 CSV 文件读入 .NET 数据表

    如何将 CSV 文件加载到System Data DataTable 根据CSV文件创建数据表 常规 ADO net 功能是否允许这样做 我一直在使用OleDb提供者 但是 如果您正在读取具有数值的行 但希望将它们视为文本 则会出现问题 但
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API

随机推荐

  • 代码评审工具Phabricator安装和部署

    1 安装 1 1 安装要求 Phabricator是一个LAMP应用套件 因此最基本的要求就是LAMP环境 Linux Linux的不同发行版及变种是必需的 MacOS X是一个可接受的Linux变种 Windows不是 Phabricat
  • 第二篇 AlexNet——模型精讲

    文章目录 摘要 1 创新点 2 模型结构 3 模型特点 4 Pytorch官方实现 摘要 AlexNet是由Alex Krizhevsky 提出的首个应用于图像分类的深层卷积神经网络 该网络在2012年ILSVRC ImageNet Lar
  • 什么是模式识别

    什么是模式识别 当我们人眼看到一幅画时 我们能够很清晰的知道其中哪里是动物 哪里是山 水 人等等 但是人眼又是如何识别和分辨的呢 其实很简单 人类也是在先验知识和对以往多个此类事物的具体实例进行观察的基础上得到的对此类事物整体性质和特点的认
  • (二叉树)二叉搜索树的查找、插入和删除

    1 二叉搜索树简介 二叉搜索树或者是一棵空树 或者是具有下列性质的二叉树 若它的左子树不空 则左子树上所有结点的值均小于它的根结点的值 若它的右子树不空 则右子树上所有结点的值均大于它的根结点的值 它的左 右子树也分别为二叉搜索树 二叉搜索
  • 孙燕姿谈“AI孙燕姿”:她的反应让人意外,深入体验揭示其背后的真相与潜力!

    目录 前言 AI歌手简介 AI歌手的技术原理 孙燕姿对 AI孙燕姿 的看法 结论 个人感受 一 你听过AI歌手的音乐呈现吗 作为听众你的感受如何 二 你认为这种新型演艺模式能否获得广泛的市场认可 原因是什么 三 你认为AI歌手会取代流行歌手
  • 第十三届蓝桥杯省赛 JAVA A组 - 矩形拼接

    个人博客 https blog csdn net Newin2020 spm 1011 2415 3001 5343 专栏地址 蓝桥杯题解集合 专栏定位 为想参加蓝桥杯的小伙伴整理常考算法题解 祝大家都能取得理想成绩 如果有收获的话 欢迎点
  • 【ChatGPT炒菜攻略】如何做韭菜

    ChatGPT可以化身为一名厨师 不仅有着扎实的厨艺基础和丰富的经验 而且也对食材的选取十分讲究 时常会寻找新鲜和有潜力的材料进行尝试和创新 从而创造出更加优秀和惊艳的佳肴 同时 我注重菜品的色 香 味 形均衡 追求将自然与文化相融合 以满
  • ip最长匹配mysql实现

    ip最长匹配计算 mysql使用inet aton函数实现 mask是ip的 select from select inet aton 10 181 88 1 inet aton mask inet aton prefix as match
  • Java程序跨平台原理

    平台 指的是操作系统 Windows Linux Mac 跨平台 Java程序可以在任一操作系统上运行 一次编写到处运行 原理 实现跨平台需要依赖Java的虚拟机JVM Java Virtual Machine Java程序 可以在Wind
  • win10 的图标丢失了怎么办?

    情况说明 几分钟前 自己手贱 居然一不小心把那D盘的分区表给删了 虽然说是借助DiskGenius即使找了回来 但是一个尴尬的情况出现了 原来装在D盘的程序虽然可以用 但是图标却没了 这对于有强迫症的我来说 让我浑身不舒服 解决方案 首先
  • java读取Excel —— XSSFWorkbook 找不到该类

    做一个Excel表格的读取时导入 org apache poi 包后居然提示 XSSFWorkbook 找不到 原来是还需要下载一个jar包 poi ooxml 包 之后在引入相关类即可 import org apache poi xssf
  • Window XP驱动开发(二十四) 电源管理

    转载自 http blog csdn net xxxluozhen article details 5023703 一 电源管理 1 WDM电源管理模型 在Windows 2000和Windows 98中 操作系统接管了大部分电源管理工作
  • (数据结构)1.实现图的邻接矩阵和邻接表的存储 2.实现图的遍历算法

    实验内容 1 编写一个程序graph cpp 设计带权图的邻接矩阵与邻接表的创建和输出运算 并在此基础上设计一个主程序exp8 1 cpp完成以下功能 1 建立如图8 54所示的有向图G的邻接矩阵 并输出之 2 建立如图8 54所示的有向图
  • 力扣:70. 爬楼梯

    假设你正在爬楼梯 需要 n 阶你才能到达楼顶 每次你可以爬 1 或 2 个台阶 你有多少种不同的方法可以爬到楼顶呢 示例 1 输入 n 2 输出 2 解释 有两种方法可以爬到楼顶 1 1 阶 1 阶 2 2 阶 示例 2 输入 n 3 输出
  • Boot与APP的Hex合并

    软件准备 使用的软件是srec cat软件 下载地址 合并脚本编写 ECHO OFF 如果存在上一次的hex文件就删除 if exist BootJoinAPP CCP APP hex del BootJoinAPP CCP APP hex
  • C# 远程唤醒(远程开机)

    C 远程唤醒 远程开机 近日 小白要用到远程开机的功能 网上大多介绍的是Magic Packet的工具 实际上 此Magic Packet是AMD公司开发的 请在google cn中搜索Magic Packet Technology 原理上
  • Mysql递归查询

    SELECT IFNULL CONCAT GROUP CONCAT CONCAT catId t id catName t name ch catLevel t level AS companyCategories FROM SELECT
  • 微服务实践--微服务方法论00

    思想 在接收到一个新的新项目时 架构师的职责是建立项目的业务与技术实现之间的桥梁 在翻译业务到技术实现的过程中需要进行业务建模 技术设计等方面的工作 业务建模和技术设计过程中都有各自领域的知识体系 基本上每个知识体系都是由上层的理论 概念和
  • python判断素数的函数_python判断是否为素数

    质数 prime number 又称素数 指在一个大于1的自然数中 除了1和此整数自身外 不能被其他自然数整除的数 素数在数论中有着很重要的地位 比1大但不是素数的数称为合数 1和0既非素数也非合数 素数是与合数相对立的两个概念 二者构成了
  • C++实现栈的顺序存储与链式存储

    栈是一种特殊的数据结构 栈中数据先进后出 且栈中数据只能从头部出栈 能直接访问的数据也仅为栈的头部数据 要想访问下面的数据则需要将前面的数据逐个出栈后才可访问 下面通过一个word撤销的案例来解释 我们用word写paper时 首先需要创建