深入理解数据结构——堆栈应用(括号匹配)

2023-10-27

#include <iostream>
#include <string>

using namespace std;


typedef char Etype;

//顺序存储堆栈
struct Stack {
	Etype* element;
	int top;
	int maxsize;
};

//创建空堆栈
void CreateStack(Stack& S, int MaxStackSize) {
	S.maxsize = MaxStackSize;
	S.element = new Etype[S.maxsize];//创建数组元素
	S.top = -1;//top指向的是数据空间的第一个元素,本身的值代表数据元素的下表,空表设top为-1
}

//判断堆栈是否为空
bool IsEmpty(Stack& S) {
	if (S.top == -1) return true;
	else return false;
}

//判断堆栈是否满了
bool IsFull(Stack& S) {
	if (S.top >= S.maxsize - 1) return true;
	else return false;
}

//返回栈顶元素的值
bool GetTop(Stack& S, Etype& result) {
	if (IsEmpty(S)) return false;
	result = S.element[S.top];
	return true;
}

//出栈操作,将栈顶元素取出,并且将top指向下一个元素的位置
bool Pop(Stack& S, Etype& result) {
	if (IsEmpty(S)) return false;
	result = S.element[S.top];
	S.top--;//栈顶指向下一个元素地址
	return true;
}

//进栈操作,将top+1,输入元素存入新的栈顶
bool Push(Stack& S, Etype& x) {//传入的是x的地址
	if (IsEmpty(S)) return false;
	S.top++;
	S.element[S.top] = x;
	return true;
}


//检验表达式中的括号匹配
//匹配“{()()}}#”
void Matching(char exp[]) {//传入一个字符串数组
	char ch;
	int MaxStackSize = 10;
	Stack S;
	CreateStack(S, MaxStackSize);
	
	ch = *exp++;
	while (ch != '#') {
		switch (ch) {
			case '(': {
				Push(S, ch); break;
			}
			case '[': {
				Push(S, ch); break;
			}
			case ')': {
				if (!IsEmpty(S)) {
					Pop(S, ch);
					if (ch != '(')
						//return ;
						cout << "error11:右边是),左边不是(!"<<endl;
				}
				else
					//return ;
					cout << "error12:右边是],左边没有任何括号!" << endl;
					break;
			}
			case ']': {
				if (!IsEmpty(S)) {
					Pop(S, ch);
					if (ch != '[')
						//return ;
						cout << "error21:右边是],左边不是[!" << endl;
				}
				else
					//return ;
					cout << "error22:右边是],左边没有任何括号!" << endl;
				break;
			}
		}
		ch = *exp++;
	}
	if(!IsEmpty(S))
		//return
		cout << "error3:右边括号,左边没有括号了!" << endl;
}

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

深入理解数据结构——堆栈应用(括号匹配) 的相关文章

  • 为什么通过派生类对基类的引用与 :: - 运算符不明确?

    所以我想知道为什么以下钻石问题的代码片段无法编译 我知道这个问题通常是通过虚拟继承来解决的 我不是故意使用它的 该代码只是为了展示我的问题 即为什么编译器称此不明确 因此 我在 struct Base 中声明了两个成员变量 因为这两个子类
  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • Volatile.Read 和 Volatile.Write 背后的逻辑是什么?

    来自 MSDN Volatile Read 读取字段的值 在需要它的系统上 插入一个 阻止处理器重新排序内存的内存屏障 操作如下 如果在该方法之后出现读或写 代码 处理器无法移动它before这个方法 and Volatile Write
  • 我应该把 try/catch 和“using”语句放在哪里? [复制]

    这个问题在这里已经有答案了 可能的重复 try catch using 正确的语法 https stackoverflow com questions 4590490 try catch using right syntax 我想try c
  • 编写此代码片段的有效方法是什么? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 更有效和 或更短地重写此代码以节省字节并显得不那么冗长的方法 if N 2 0 N 6 N 8 N 10 N 12 N 14 N 16 N
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • WebClient.DownloadDataAsync 冻结了我的 UI

    我在 Form 构造函数中的 InitializeComponent 之后有以下代码 using WebClient client new WebClient client DownloadDataCompleted new Downloa
  • c# 从另一个类中的另一个静态事件引发事件

    需要帮助从另一个班级调用事件 我有已声明事件的课程 public class MxPBaseGridView GridView public event AddNewItemsToPopUpMenuEventHandler AddNewIt
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 司机和提供商之间的区别

    数据库中的驱动程序和提供程序有什么区别 有没有解释一下 不胜感激 样本 ADO NET driver for MySQL vs providerName System Data EntityClient 来自 MSDN 论坛 驱动程序是安装
  • 如何以编程方式播放 16 位 pcm 数组 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有一个包含 16 位 pcm 值的短 数组 我希望能够在不添加任何标题 也不将任何文件保存到内存的情况下播放它 我知道我可能需要一个提供
  • C++ 将联合强制转换为其成员类型之一

    以下对我来说似乎完全符合逻辑 但不是有效的 C 联合不能隐式转换为其成员类型之一 有人知道为什么不这样做的充分理由吗 union u int i char c function f int i int main u v v i 6 f v
  • 将日期时间转换为指定格式

    我有这个日期格式yy MM dd HH mm ss ex 12 02 21 10 56 09 问题是 当我尝试使用以下代码将其转换为不同格式时 CDate 12 02 21 10 56 09 ToString MMM dd yyyy HH
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • Resharper:IEnumerable 的可能多重枚举

    我正在使用新的 Resharper 版本 6 在我的代码中的几个地方 它给一些文本加了下划线 并警告我可能存在IEnumerable 可能的多重枚举 我理解这意味着什么 并在适当的情况下采纳了建议 但在某些情况下 我不确定这实际上是一个大问
  • 如何在 C# 中获取 Json 数组?

    我有一个像这样的 Json 字符串 我想将它加载到 C 数组中 当我尝试这样做时 我收到异常 我的字符串 customerInformation customerId 123 CustomerName Age 39 Gender Male
  • 无法为 wsdl 文件创建服务引用

    I have wsdl文件和xsd我本地机器上的文件 我想在项目中添加服务引用 我没有网络服务 我只有wsdl file 我收到以下错误 The document was understood but it could not be pro
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void

随机推荐

  • 全面探索 FreeMarker 模版引擎的扩展性

    FreeMarker 模版引擎简介 FreeMarker 是一个采用 Java 开发的模版引擎 是一个基于模版生成文本的通用工具 FreeMarker 被设计用来生成 HTML Web 页面 特别是基于 MVC 模式的应用程序 虽然 Fre
  • xxxx is deprecated

    编译工程发现json object object get is deprecated 最终解决 jason c库中有声明 deprecated Please use json object object get ex json c库编译的时
  • 中国银行业数字化转型研究报告 附下载

    以在数据化 智能化为特征的数字化转型是银行业的一次产业革命 以支付功能的在线化为例 近年来移动支付领域的 脱媒 给银行上了生动的一课 即使是全国性的大型银行 面对互联网公司的 降维 竞争也是无能为力 区域性银行更是全面失守 这种数字化金融服
  • 如何阻止点击其他区域,input框会失去焦点事件

    如何阻止点击其他区域 input输入框会失去焦点位置 阻止失去焦点 通过a标签 设置user select为none 通过js阻止默认事件 通过内联js实现 在开发过程中 总会碰到以下两个情况 要求点击某个区域 阻止input框 或者设置了
  • 1.30 fcntl函数

    include
  • 什么是super?如何使用super调用超类构造函数?

    从之前的文章中分享过的一些知识 从Box派生的类并没有体现出它们的实际上是多么有效和强大 例如 BoxWeight构造函数明确的初始化了Box 的width height和depth成员 这些重复的代码在它的超类中已经存在 这样做效率很低
  • 7-40 一维数组最大值和最小值交换 (10 分)

    找出含有10个元素一维数组中的最大值和最小值 并互换这两个数的位置 输入格式 在一行中输入10个整数 数据之间只能用1个空格间隔 输出格式 在一行中按照 max 最大值 min 最小值 的格式输出结果 最大值和最小值均原样输出 没有列宽控制
  • 关于C/C++动态申请空间释放和内存泄漏问题介绍

    1 动态申请空间 1 1 基本内容 动态申请的空间没有具体名称 只能通过指针间接访问 无论new还是malloc方式 动态申请空间都是存放在堆中 有别于系统自动分配的空间是存放在堆栈中 即栈 栈中系统分配的空间 在使用结束会自动释放 而程序
  • UVA11134 Fabled Rooks

    UVA11134 Fabled Rooks 题目链接 问题解析 在n行n列的棋盘上放n个车 第i个车在给定的矩形Ri之内 且任意两个车不能相互攻击 即任意两个车不在同一行或同一列 求每个车的位置坐标 首先 一个车所在的行不会影响它所在的列
  • OPENCV缺陷检测小例子

    前阵子在某公众号看到halcon做缺陷检测的例子 由于不会使用halcon 其附带的 dev代码也看不懂 于是自己写了opencv代码来实现 原图如下 其目的是要检测红框中的缺陷 代码如下
  • matlab 计算点云协方差矩阵

    目录 一 概述 1 算法概述 2 主要函数 二 代码示例 三 结果展示 四 参数解析 输入参数 输出参数 五 参考链接 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 概述
  • C++不定参数函数

    类似这样的函数定义 printf char fmt 示例 自定义一个可变函数 Func char s char fmt 特点是函数必须有一个char fmt作为变量 它一般用在可变参数的前一个参数 根据这个变量计算出后续参数的地址或值 它们
  • php中table的最小宽度,table宽度

    题目虽然是说table的宽度 但其实最让人抓狂的是单元格td的宽度 平时开发中也经常会遇到这方面的问题 所以我找资料学习table的宽度的算法 table layout table layout定义了表格布局算法 值为auto或fixed
  • pycharm同步代码到远程服务器

    首先有一个python的项目 可以新建一个 Tools gt Development gt Configurations 新建一个SFTM连接 在connection页面配置服务器的用户名与密码 Root path这里配置一个根目录 注意R
  • IOException parsing XML document from class path resource [spring-mvc.xml]

    如果你写的都没问题 那一定是静态资源导入问题 可以试试下面的这个
  • springboot中@Async的使用

    async注解的使用 springboot中的启动类中需要添加注解 EnableAsync来开启异步调用 在需要异步执行的方法上添加 Async taskExecutor 注解进行标注 启动类 EnableScheduling Enable
  • CUDA C/C++ 中如何优化数据传输

    设备内存和 GPU 之间的峰值带宽 例如 在 NVIDIA Tesla C2050 上为 144 GB s 远高于主机内存和设备内存之间的峰值带宽 在 PCIe x16 Gen2 上为 8 GB s 这种差异意味着您在主机和 GPU 设备之
  • c语言练习题55:IP 地址⽆效化

    IP 地址 效化 题 描述 给你 个有效的 IPv4 地址 address 返回这个 IP 地址的 效化版本 所谓 效化 IP 地址 其实就是 代替了每个 例 1 输 address 1 1 1 1 输出 1 1 1 1 例 2 输 add
  • Oracle:number类型的使用

    一 number m n 创建测试表 create table t1 a number b number 9 c number 9 2 d number 9 1 e number 6 f number 7 2 g number 7 2 插入
  • 深入理解数据结构——堆栈应用(括号匹配)

    include