C++入门介绍之“栈”

news2024/10/2 20:28:31

1.1栈的定义

栈(stack)是一种只能在一端进行插入或删除的线性表

下面是一些基础概念

  • 栈顶(top) : 表中允许进行插入、删除操作的线性表
  • 栈底(bottom):表的另一端
  • 空栈 :栈中没有数据元素
  • 进栈/入栈(push):栈的插入操作
  • 出栈/退栈(pop):栈的删除操作

栈的抽象数据类型定义:

在这里插入图片描述

1.2栈的存储结构

采用顺序存储结构的栈称为顺序栈

栈中的元素相对位置是成线性的

声明:

typedef char ElemType;
typedef struct
{
	ElemType data[MaxSize];
	int top;	//栈顶指针
}SqStack;

图示:

在这里插入图片描述

1.3 顺序栈基本运算

我们首先要明确几点:

  • 栈满的条件:s–>top = MaxSize - 1
  • 元素e的进栈操作:先将栈顶指针top增1,然后将元素e放在栈顶指针处
  • 出栈操作:先将栈顶指针top处的元素取出放在e中,然后栈顶指针减1

操作图示:

在这里插入图片描述


(1)初始化栈

//栈的初始化
void InitStack(SqStack*& s)
{
	s = (SqStack*)malloc(sizeof(SqStack));
	s->top = -1;//栈顶指针置-1
}

(2)销毁栈

//栈的销毁
void DestroyStack(SqStack*& s)
{
	free(s);
}

(3)判断栈是否为空

//栈是否为空
bool StackEmpty(SqStack* s)
{

	return (s->top == -1);
}

(4)进栈

//进栈
bool Push(SqStack*& s, ElemType e)
{
	if (s->top == MaxSize -1)//栈满
		return false;
	s->top++;	//栈顶指针增一
	s->data[s->top] = e; //元素e放在栈顶指针处
	return true;
}

(5)出栈

bool Pop(SqStack*& s, ElemType& e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];//取栈顶元素
	s->top--;
	return true;
}

(6)取栈顶元素

bool GetTop(SqStack* s, ElemType& e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}

顺序栈的完整代码如下:

#include<iostream>
using  namespace std;
#define MaxSize 50
typedef char ElemType;
typedef struct
{
	ElemType data[MaxSize];
	int top;	//栈顶指针
}SqStack;
//栈的初始化
void InitStack(SqStack*& s)
{
	s = (SqStack*)malloc(sizeof(SqStack));
	s->top = -1;//栈顶指针置-1
}
//栈的销毁
void DestroyStack(SqStack*& s)
{
	free(s);
}
//栈是否为空
bool StackEmpty(SqStack* s)
{

	return (s->top == -1);
}
//进栈
bool Push(SqStack*& s, ElemType e)
{
	if (s->top == MaxSize -1)//栈满
		return false;
	s->top++;	//栈顶指针增一
	s->data[s->top] = e; //元素e放在栈顶指针处
	return true;
}
bool Pop(SqStack*& s, ElemType& e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];//取栈顶元素
	s->top--;
	return true;
}
bool GetTop(SqStack* s, ElemType& e)
{
	if (s->top == -1)
		return false;
	e = s->data[s->top];
	return true;
}

int main() {
	SqStack* st;
	ElemType e;
	ElemType s[] = "abcba";

	return 0;
}

1.3栈的链式存储结构

由于栈中的数据元素的逻辑关系呈线性关系,所以栈可以像顺序表由于采用链式存储结构。即链栈

优点:相比于顺序栈,在内存允许情况下,链栈是不存在栈满的情况。

声明如下:

typedef char ElemType;
typedef struct linknode
{
	ElemType data;	//数据域
	struct linknode* next;//指针域
}LinkStNode;

1.4链栈的基本算法

重点:

  • 栈空的条件:s–>next == NULL
  • 元素e进栈操作:新建一个结点存放元素e,将结点p插入到头结点之后
  • 出栈操作:取出首结点的data值并将其删除

(1)初始化栈

//初始化栈
void InitStack(LinkStNode*& s)
{
	s = (LinkStNode*)malloc(sizeof(LinkStNode));
	s->next = NULL;
}

(2)销毁栈

//销毁栈
void DestroyStack(LinkStNode*& s)
{
	LinkStNode* pre = s, * p = s->next;
	while (p != NULL)
	{
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}

(3)判断栈为空

//判断栈是否为空
bool StackEmpty(LinkStNode* s)
{
	return (s->next == NULL);
}

(4)进栈

//进栈
void Push(LinkStNode*& s, ElemType e)
{
	LinkStNode* p;
	p = (LinkStNode*)malloc(sizeof(LinkStNode));//不要忘记开辟空间
	p->data = e;
	p->next = s->next;
	s->next = p;
}

(5)出栈

bool Pop(LinkStNode*& s, ElemType& e)
{
	LinkStNode* p;
	if (s->next == NULL)
		return false;
	p = s->next;
	e = p->data;
	s->next = p->next;
}

(6)取栈顶元素

bool GetTop(LinkStNode* s, ElemType& e)
{
	if (s->next == NULL)
		return false;
	e = s->next->data;
	return true;
}

完整代码:

#include<iostream>
using namespace std;
typedef char ElemType;
typedef struct linknode
{
	ElemType data;	//数据域
	struct linknode* next;//指针域
}LinkStNode;
//初始化栈
void InitStack(LinkStNode*& s)
{
	s = (LinkStNode*)malloc(sizeof(LinkStNode));
	s->next = NULL;
}
//销毁栈
void DestroyStack(LinkStNode*& s)
{
	LinkStNode* pre = s, * p = s->next;
	while (p != NULL)
	{
		free(pre);
		pre = p;
		p = pre->next;
	}
	free(pre);
}
//判断栈是否为空
bool StackEmpty(LinkStNode* s)
{
	return (s->next == NULL);
}
//进栈
void Push(LinkStNode*& s, ElemType e)
{
	LinkStNode* p;
	p = (LinkStNode*)malloc(sizeof(LinkStNode));//不要忘记开辟空间
	p->data = e;
	p->next = s->next;
	s->next = p;
}
//出栈
bool Pop(LinkStNode*& s, ElemType& e)
{
	LinkStNode* p;
	if (s->next == NULL)
		return false;
	p = s->next;
	e = p->data;
	s->next = p->next;
}
//取栈顶元素
bool GetTop(LinkStNode* s, ElemType& e)
{
	if (s->next == NULL)
		return false;
	e = s->next->data;
	return true;
}

}
int main()
{
	ElemType chs1[] = "(())";
	ElemType chs2[] = "(()))";
	return 0;
}

希望本文能对你有所帮助!

在这里插入图片描述

`

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

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

相关文章

如何统计网站的访问量

本文介绍的是使用redis的HyperLoglog实现uv的统计功能。 背景 首先我们先明确一下uv这个名词代表的实际意义。uv代表的是通过网页访问浏览的人数&#xff0c;和文章的阅读量差不多&#xff0c;但是需要注意的是&#xff0c;一个人即使是多次访问&#xff0c;也只算一次。 所…

开发一个android应用需要哪些库?

目录 开发应用常用库 沉浸式体验 下拉刷新 数据库 网络访问 升级 开发应用常用库 随着手机普及&#xff0c;应用无处不在&#xff0c;我们生活也离不开应用了。 那么&#xff0c;如果你想从零开始做一个应用&#xff0c;我们一般会经过哪些阶段&#xff0c;用到哪些库呢…

揭秘外卖平台的附近公里设计

背景 相信大家都有点外卖的时候去按照附近公里排序的习惯&#xff0c;那附近的公里是怎么设计的呢&#xff1f;今天shigen带你一起揭秘。 分析 我们先明确一下需求&#xff0c;每个商家都有一个地址对吧&#xff0c;我们也有一个地址&#xff0c;我们点餐的时候&#xff0c;…

【Spring 事务和事务传播机制】

目录 1 事务概述 1.1 为什么需要事务 1.2 事务的特性 1.3 Spring 中事务的实现 2 Spring 声明式事务 2.1 Transactional 2.2 Transactional 的作用范围 2.3 Transactional 的各种参数 2.3.1 ioslation 2.4 事务发生了异常&#xff0c;也不回滚的情况 异常被捕获时 3 事务的传…

运维Shell脚本小试牛刀(七):在函数文脚本件中调用另外一个脚本文件中函数|函数递归调用|函数后台执行

运维Shell脚本小试牛刀(一) 运维Shell脚本小试牛刀(二) 运维Shell脚本小试牛刀(三)::$(cd $(dirname $0)&#xff1b; pwd)命令详解 运维Shell脚本小试牛刀(四): 多层嵌套if...elif...elif....else fi_蜗牛杨哥的博客-CSDN博客 Cenos7安装小火车程序动画 运维Shell脚本小试…

手写Spring:第8章-初始化和销毁方法

文章目录 一、目标&#xff1a;初始化和销毁方法二、设计&#xff1a;初始化和销毁方法三、实现&#xff1a;初始化和销毁方法3.1 工程结构3.2 Spring应用上下文和Bean对象扩展初始化和销毁类图3.3 定义初始化和销毁方法的接口3.3.1 定义初始化接口3.3.2 定义销毁接口3.3.3 定义…

【 OpenGauss源码学习 —— 列存储(analyze)(三)】

列存储&#xff08;analyze&#xff09; acquire_sample_rows 函数RelationGetNumberOfBlocks 函数BlockSampler_Init 函数anl_init_selection_state 函数BlockSampler_GetBlock 函数ReadBufferExtendedPageGetMaxOffsetNumber 函数HeapTupleSatisfiesVacuum 函数heapCopyTuple…

微软8月系统更新引发问题:虚拟内存分页文件出现错误

微软的八月系统更新引发了一系列问题&#xff0c;其中包括“UNSUPPORTED_PROCESSOR”蓝屏错误和文件管理器故障。尽管微软已经修复了前者&#xff0c;但据国外科技媒体Windows Latest报道&#xff0c;仍有用户反馈在非微星设备上出现“fault in nonpaged area”蓝屏错误。 如果…

信息技术 安全技术 信息安全管理测量

声明 本文是学习信息技术 安全技术 信息安全管理 测量. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 范围 为了评估按照GB/T 22080-2008规定实施的信息安全管理体系&#xff08;Information Security Management System&#xff0c;简称ISMS&#…

STM32移植FAT文件系统

所谓“移植”&#xff0c;就是打通FAT源码和物理设备之间的软件接口。 FAT源码早就被公益组织给写好了&#xff0c;直接下载源码。但是FAT作为顶层应用程序&#xff0c;它需要面对的底层物理设备是不确定的&#xff0c;那么底层的物理设备驱动程序就需要程序员来自己写。物理设…

VMware虚拟机挂起后再关机出现问题,连接不上外网解决方法,ifconfig无ens33

原文地址 Centos7 重启后ens33消失&#xff08;外部连接不上&#xff09;Centos7 重启后ens33消失&#xff08;外部连接不上&#xff09;_ens33不见了_瘦身小蚂蚁的博客-CSDN博客 解决方法&#xff1a;执行以下4个命令。 systemctl stop NetworkManager # 关闭NetworkManage…

《DevOps实践指南》- 读书笔记(二)

DevOps实践指南 Part 2 从何处开始5. 选择合适的价值流作为切入点5.1 绿地项目与棕地项目5.2 兼顾记录型系统和交互型系统5.3 从最乐于创新的团队开始5.4 扩大 DevOps 的范围5.5 小结 6. 理解、可视化和运用价值流6.1 确定创造客户价值所需的团队6.2 针对团队工作绘制价值流图6…

优思学院|精益生产与柔性制造:现代制造业的双重理念

现代制造业正不断演进&#xff0c;出现了许多新的生产理念和方法。在这其中&#xff0c;精益生产和柔性制造是两个引人注目且重要的理念。这两者不仅对企业的生产流程产生了深远的影响&#xff0c;还在提高效率、适应市场需求方面发挥着关键作用。 理念背景和核心原则 精益生…

pcd格式转ot/bt

1.具体实现可以看高博的bloghttps://www.cnblogs.com/gaoxiang12/p/5041142.html 2.问题&#xff1a;在编译octomap_tutor 源码时会报错。 修改方法&#xff1a;把cmakelists.txt里的c11改成c14

Android 文字转语音播放实现

1&#xff0c;TextToSpeech类是android自带的&#xff0c;但是部分设备需要支持TTS需要增加语音库&#xff0c;我使用的是讯飞语音&#xff08;离线的哦&#xff09;。请自行下载并安装讯飞语音APK&#xff0c;然后到系统设置中设置TTS功能默认使用该选项。有自带TTS库的可以省…

数字图像处理-图像压缩

数字图像处理-图像压缩 一、图像压缩1.1 图像压缩的意义1.2 图像的冗余信息1.2.1 编码冗余1.2.2 空间冗余1.2.3 时间冗余 二、一些基本的压缩方法2.1 霍夫曼编码2.2 行程编码2.3 算术编码2.4 LZW编码 三、数字图像水印3.1 简单的可见水印3.2LSB不可见水印 一、图像压缩 1.1 图…

亚马逊美国站干粉灭火器UL安全测试标准要求UL299测试报告

UL299干粉灭火器是一种常见的灭火设备&#xff0c;外观一般为红色罐体&#xff0c;装有干粉灭火剂。它主要以高速喷射干粉灭火剂来抑制火灾并起到灭火作用。该灭火器采用压力容器和喷射装置&#xff0c;具有紧凑结构、方便携带等特点。对于想要在亚马逊美国站上架干粉灭火器的卖…

SpingBoot整合Sa-Token框架(1)

一、文档参考&#xff1a;框架介绍 (sa-token.cc) 框架生态——开源项目 (sa-token.cc) 二、与SpingBoot整合 1、创建项目 在 IDE 中新建一个 SpringBoot 项目&#xff0c;例如&#xff1a;sa-token-demo-springboot&#xff08;不会的同学请自行百度或者参考&#xff1a;Sp…

在EC2上对SELinux故障进行紧急恢复以及排查的思路及方法

概述 SELinux&#xff0c;全称Security-Enhanced Linux&#xff0c;是一个为系统提供强制访问控制机制的安全模块&#xff0c;安装并启用SELinux模块的操作系统会为每个进程和系统资源打上一个特殊的安全标记&#xff0c;称为SELinux上下文&#xff0c;并根据SELinux上下文信息…

高阶数据结构-----三种平衡树的实现以及原理(未完成)

TreeMap和TreeSet的底层实现原理就是红黑树 一)AVL树: 1)必须是一棵搜索树:前提是二叉树&#xff0c;任取一个节点&#xff0c;它的左孩子的Key小于父亲节点的Key小于右孩子节点的Key&#xff0c;中序遍历是有序的&#xff0c;按照Key的大小进行排列&#xff0c;高度平衡的二叉…