栈类实现与括号匹配问题(c++)

news2024/11/29 10:38:06

1,关于栈

堆栈 又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
在这里插入图片描述
可以发现,最先进入栈的E是最后出去,最后进来的A第一个出去,就像一端封口的羽毛球筒,只能通过一端来拿放羽毛球。第一个放进去的羽毛球之能是最后一个拿出来。故名先进后出原则FILO(first in last out)

在c++的STL标准库中提供了几个常用的栈函数:

push(eleType ele);	//添加元素
pop();				//删除元素
size();				//获取栈大小
isempty();			//判断栈是否为空
top();				//返回栈顶元素
.....

2.自定义栈类

首先,建立一个栈类,三个私有成员,ele,size,top分别用来存放元素,表示大小,栈顶置针。并且写了构造函数与析构函数,最后初始化常用的几个函数:

class Stacks{
private:
	eleType *ele;
	int size;
	eleType top;
public:
	Stacks() : ele(nullptr),size(0),top(-1) {}
	~Stacks() { delete [] ele; }
	void initStack(int capacity);//初始化
	bool push(eleType element); //添加
	bool pop(); //弹出
	bool isEmpty(); //是否为空
	eleType getTop(); //栈顶元素
};

初始化函数实现,首先检查ele是否分配了内存,如果有,就执行删除,没有就为ele分配一个新的内存。

void Stacks::initStack(int capacity){
	if(ele) {
		delete[]  ele;
	}
	ele =  new int[capacity];
	size = capacity;
}

添加,删除函数实现,添加时先对栈进行判断,如果栈满,跑出异常,否则top指针++,将插入的值传入ele。删除函数实现先判断栈是否为空,为空抛出异常,之后top–;

//添加
bool Stacks::push(eleType element){
	if (size - 1 == top){
		throw out_of_range("Stack is full!");
	}
	top++;
	ele[top] = element;
	return true;
}
//删除
bool Stacks::pop(){
	if(isEmpty()){
		throw out_of_range("Stack is empty!");
	}
	top--;
	return true;
}

判空函数,栈顶元素实现:

//是否为空
bool Stacks::isEmpty(){
	return top == -1;
}
//返回栈顶元素
eleType Stacks::getTop(){
	if(!isEmpty()) return ele[top];
	else throw out_of_range("Stack is empty!");
}

完整程序与主函数调用:

#include <iostream>
#include<stdexcept>
using namespace std;
#define eleType int

class Stacks{
private:
	eleType *ele;
	int size;
	eleType top;
public:
	Stacks() : ele(nullptr),size(0),top(-1) {}
	~Stacks() { delete [] ele; }
	void initStack(int capacity);//初始化
	bool push(eleType element); //添加
	bool pop(); //弹出
	bool isEmpty(); //是否为空
	eleType getTop(); //栈顶元素
};
//初始化
void Stacks::initStack(int capacity){
	if(ele) {
		delete[]  ele;
	}
	ele =  new int[capacity];
	size = capacity;
}
//添加
bool Stacks::push(eleType element){
	if (size - 1 == top){
		throw out_of_range("Stack is full!");
	}
	top++;
	ele[top] = element;
	return true;
}
//删除
bool Stacks::pop(){
	if(isEmpty()){
		throw out_of_range("Stack is empty!");
	}
	top--;
	return true;
}
//是否为空
bool Stacks::isEmpty(){
	return top == -1;
}
//返回栈顶元素
eleType Stacks::getTop(){
	if(!isEmpty()) return ele[top];
	else throw out_of_range("Stack is empty!");
}
int main() {
	Stacks s;
	s.initStack(10);
	s.push(4);
	s.push(5);
	s.push(6);
	int n1 = s.getTop();
	s.pop();
	int n2 = s.getTop();
	s.pop();
	cout<<n1 + n2;
}

3.括号匹配问题

括号匹配问题是一个在计算机科学和编程中常见的问题。主要是检查一个字符串中的括号是否正确配对,即每一个打开的括号(如“(”、“{”、“[”)都有一个相对应的关闭括号(如“)”、“}”、“]”),并且它们的顺序是正确的。

我们可以用上面的栈来解决问题。以下是解决括号匹配问题的算法步骤:

  • 1.初始化一个空栈:用于存储尚未匹配的开放括号。
  • 2.遍历输入字符串:逐个检查字符。
  • 3.遇到开放括号:将其压入栈中。
  • 4.遇到关闭括号:检查栈顶元素是否是与该关闭括号匹配的开放括号。如果是,则将栈顶元素弹出;如果不是或栈为空,则括号不匹配。
  • 5.遍历结束后检查栈:如果栈为空,说明所有括号都正确匹配;如果栈不为空,说明还有未匹配的开放括号,因此括号不匹配。

函数实现:

bool isMatching(char *str,int len){
	Stacks s;
	s.initStack(100);
	for(int i=0;i<len;i++){
		if(str[i] == '(' || str[i] == '[' || str[i] == '{'){
			s.push(str[i]);
		}
		if(str[i]==')'){
			if(s.getTop() != '(' || s.isEmpty()) return false;
			s.pop();
		}
		if(str[i]==']'){
			if(s.getTop() != '[' || s.isEmpty()) return false;
			s.pop();
		}
		if(str[i]=='}'){
			if(s.getTop() != '{' || s.isEmpty()) return false;
			s.pop();
		}
	}
	return s.isEmpty();
}

完整程序:

#include <iostream>
#include<stdexcept>
using namespace std;
#define eleType char

class Stacks{
private:
	eleType *ele;
	int size;
	eleType top;
public:
	Stacks() : ele(nullptr),size(0),top(-1) {}
	~Stacks() { delete [] ele; }
	void initStack(int capacity);//初始化
	bool push(eleType element); //添加
	bool pop(); //弹出
	bool isEmpty(); //是否为空
	eleType getTop(); //栈顶元素
};
//初始化
void Stacks::initStack(int capacity){
	if(ele) {
		delete[]  ele;
	}
	ele =  new eleType[capacity];
	size = capacity;
}
//添加
bool Stacks::push(eleType element){
	if (size - 1 == top){
		throw out_of_range("Stack is full!");
	}
	top++;
	ele[top] = element;
	return true;
}
//删除
bool Stacks::pop(){
	if(isEmpty()){
		throw out_of_range("Stack is empty!");
	}
	top--;
	return true;
}
//是否为空
bool Stacks::isEmpty(){
	return top == -1;
}
//返回栈顶元素
eleType Stacks::getTop(){
	if(!isEmpty()) return ele[top];
	else throw out_of_range("Stack is empty!");
}
bool isMatching(char *str,int len){
	Stacks s;
	s.initStack(100);
	for(int i=0;i<len;i++){
		if(str[i] == '(' || str[i] == '[' || str[i] == '{'){
			s.push(str[i]);
		}
		if(str[i]==')'){
			if(s.getTop() != '(' || s.isEmpty()) return false;
			s.pop();
		}
		if(str[i]==']'){
			if(s.getTop() != '[' || s.isEmpty()) return false;
			s.pop();
		}

		if(str[i]=='}'){
			if(s.getTop() != '{' || s.isEmpty()) return false;
			s.pop();
		}
	}
	return s.isEmpty();
}
int main() {
	char str[] = "(){}[}";
	int len  = strlen(str);
	cout<<isMatching(str, len);
}

如有错误,欢迎指正!

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

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

相关文章

Linux重点思考(上)--权限/解压/定时任务/性能

Linux重点思考(上&#xff09;--权限/解压/定时任务 权限修改格式chmod使用 打包解压tar -zcvf ab.tar&#xff08;打包&#xff09;tar -xvf ab.tar -C/usr &#xff08;解压&#xff09; 系统防火墙service iptables statussystemctl status iptables区别 定时任务定时任务-c…

【Java多线程(3)】线程安全问题和解决方案

目录 一、线程安全问题 1. 线程不安全的示例 2. 线程安全的概念 3. 线程不安全的原因 二、线程不安全的解决方案 1. synchronized 关键字 1.1 synchronized 的互斥特性 1.2 synchronized 的可重入特性 1.3 死锁的进一步讨论 1.4 死锁的四个必要条件&#xff08;重点&…

2024UI自动化面试题汇总【建议收藏】

1.你是如何搭建ui自动化框架的&#xff1f; 在搭建ui自动化框架&#xff0c;使用的是po设计模式&#xff0c;也就是把每一个页面所需要 操作的元素和步骤都封装成一个页面类中。然后使用seleniumunittest搭建 四层框架实现数据、脚本、业务逻辑分离&#xff08;关键字驱动&…

怎样在Linux搭建NTP服务器

搭建 NTP&#xff08;Network Time Protocol&#xff09;服务器可以帮助你在局域网内提供时间同步服务&#xff0c;让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤&#xff1a; 安装 NTP 服务器软件&#xff1a; 在终端中执行以下命令安装 N…

计算机网络实验四:MAC地址、IP地址、ARP地址

目录 实验四&#xff1a;MAC地址、IP地址、ARP地址 4.1 实验目的 4.2 实验步骤 4.2.1 构建网络拓扑 4.2.2 配置各网络设备 4.2.3 网络功能验证测试 4.3 实验总结 实验四&#xff1a;MAC地址、IP地址、ARP地址 4.1 实验目的 &#xff08;1&#xff09;掌握计算机网络中…

使用mybatis的@Interceptor实现拦截sql

一 mybatis的拦截器 1.1 拦截器介绍 拦截器是一种基于 AOP&#xff08;面向切面编程&#xff09;的技术&#xff0c;它可以在目标对象的方法执行前后插入自定义的逻辑。 1.2 语法介绍 1.注解Intercepts Intercepts({Signature(type StatementHandler.class, method “…

深度理解C++多继承和多态

首先我们看看多继承的多态是如何发生的。 #include <iostream>using std::cout; using std::endl;class A {public:virtualvoid a(){cout<<"virtual A::a()"<<endl;}virtualvoid b(){cout<<"virtual A::b()"<<endl;}virtua…

【C++进阶】多态,带你领悟虚函数和虚函数表

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 【本节目标】 1. 多态的概…

京东云8核16G服务器配置租用优惠价格1198元1年、4688元三年

京东云轻量云主机8核16G服务器租用优惠价格1198元1年、4688元三年&#xff0c;配置为8C16G-270G SSD系统盘-5M带宽-500G月流量&#xff0c;华北-北京地域。京东云8核16G服务器活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云8核16G服务器优惠价格 京东云…

uniapp 微信小程序 输入框跟随手机键盘弹起

需求&#xff1a;手机键盘弹起后&#xff0c;页面底部的输入框跟随弹起&#xff0c;且页面不被顶上去 html: <textareaclass"textinput"placeholder-class"input-place"auto-height:maxlength"2000"v-model"text"placeholder"…

工业测试测量仪器与人工智能(AI)如何结合

工业测试测量仪器与人工智能&#xff08;AI&#xff09;的结合可以通过多种方式实现&#xff0c;其中一些主要方法包括&#xff1a; 1. 数据分析和预测 智能数据分析&#xff1a;利用AI算法对从传感器和测试仪器收集的数据进行分析&#xff0c;识别模式、趋势和异常&#xff0…

基于单片机热敏电阻PT100温度控制系统设计

**单片机设计介绍&#xff0c;基于单片机热敏电阻PT100温度控制系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机热敏电阻PT100的温度控制系统设计是一个综合了硬件和软件设计的工程任务。以下是对该设计概要的…

我如何学会在学术界培养人际关系,并变得更加友善

我是一名初级教授&#xff0c;压力很大&#xff0c;工作到筋疲力尽&#xff0c;但在工作和家庭中仍然感到不足。因此&#xff0c;当我的入门编程课程的三名学生在学期结束时来到我的办公室&#xff0c;对他们的成绩感到担忧时&#xff0c;我觉得我没有时间处理他们的抱怨。我觉…

总结IP协议各类知识点

前言 本篇博客博主将详解IP协议中的各类知识点&#xff0c;坐好板凳发车啦~ 一.IP协议格式 1.1 4位版本号&#xff08;version&#xff09; 指定IP协议的版本&#xff0c;对于IPv4来说&#xff0c;就是4。 1.2 4位头部长度&#xff08;header length&#xff09; IP头部的…

数据结构算法系列----贪心算法

目录 一、什么是贪心 1、定义&#xff1a; 2、举例&#xff1a; 二、例题 完整代码&#xff1a; 一、什么是贪心 1、定义&#xff1a; 贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法。在贪心算法中&#xff0c;通过 局部最优 解来达到全局最优解。贪心算法…

(C语言)fgets与fputs函数详解

目录 1. fputs函数详解 1.1 向文件流输入数据 1.2 向标准输出流输出数据 2. fgets函数详解 2. 1 从文件流中得到数据 2.2 从标准输入流读取数据 1. fputs函数详解 头文件&#xff1a;stdio.h 函数有两个参数&#xff1a;str 与 stream 作用&#xff1a;写一串字符串到流…

计算机系统基础 5 物理地址的形成

历史 早期&#xff0c;程序员自己管理主存&#xff0c;通过分解程序并覆盖主存的方式执行程序 取指令和存储操作数所有的地址都是物理地址&#xff1b; 执行速度快&#xff0c;无需进行地址转换&#xff1b; 未采用虚拟存储机制。 1961年有人提出自动执行overlay…

【动手学深度学习-pytorch】9.2长短期记忆网络(LSTM)

长期以来&#xff0c;隐变量模型存在着长期信息保存和短期输入缺失的问题。 解决这一问题的最早方法之一是长短期存储器&#xff08;long short-term memory&#xff0c;LSTM&#xff09; (Hochreiter and Schmidhuber, 1997)。 它有许多与门控循环单元&#xff08; 9.1节&…

【学习笔记】java项目—苍穹外卖day04

文章目录 1. 新增套餐1.1 需求分析和设计1.2 代码实现1.2.1 DishController1.2.2 DishService1.2.3 DishServiceImpl1.2.4 DishMapper1.2.5 DishMapper.xml1.2.6 SetmealController1.2.7 SetmealService1.2.8 SetmealServiceImpl1.2.9 SetmealMapper1.2.10 SetmealMapper.xml1.…

HarborCDN技术分析

一、介绍 简要介绍 ​​Harbor​​ 是由VMware公司开源的企业级的Docker Registry管理项目&#xff0c;它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。Harbor 的所有组件都在 Dcoker 中部署&#xff0c;所以 Harbor 可使用 Docker C…