数据结构——括号匹配问题

括号匹配

给定一个字符串,其中的字符只包含三种括号:花括号{ }、中括号[ ]、圆括号( ),即它仅由 “( ) [ ] { }” 这六个字符组成。设计算法,判断该字符串是否有效,即字符串中括号是否匹配。括号匹配要求括号必须以正确的顺序配对,如 “{ [ ] ( ) }” 或 “[ ( { } [ ] ) ]” 等为正确的格式,而 “[ ( ] )” 或 “{ [ ( ) }” 或 “( { } ] )” 均为不正确的格式。

所需的知识前提:栈

以下是顺序栈的基本算法

结构表示,初始化,销毁栈,入栈,出栈,得到栈顶元素,判断栈是否为空等算法

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#include<malloc.h>
#include<string>typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef char ElemType;
typedef struct {ElemType *base; 	// 栈底指针ElemType *top; 	// 栈顶指针int stacksize; 	// 栈空间大小
} SqStack;void InitStack(SqStack &S)
{// 构造一个空栈Sif(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType))))exit(OVERFLOW);     // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{// 销毁栈S,S不再存在free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;
}void Push(SqStack &S, ElemType e)
{if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间S.base = (ElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(ElemType));if(!S.base)exit(OVERFLOW);           // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACK_INCREMENT;}*(S.top)++ = e;
}Status Pop(SqStack &S, ElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}

解决问题的关键代码
//思路
1.如果是左括号{ , [ , ( , 就入栈
2如果是右括号,先判断栈顶元素是否是这个右括号对应的左括号
若是则出栈
若不是则返回no
3待字符串全部读取完,看栈中栈顶指针与栈底指针指向是否唯一(即判断栈是否为空)
若栈空,即满足括号匹配输出yes
若栈不空,即不满足括号匹配输入no

void praenthese_match()
{ 	SqStack S;InitStack(S);printf("输入带括号的字符串序列:");char a[100];scanf("%s",a);int l=strlen(a);char e;for(int i=0;i<l;i++){if(a[i]=='('||a[i]=='['||a[i]=='{'){Push(S,a[i]);}else{if(a[i]==')'&&*(S.top-1)=='(')Pop(S,e);else if(a[i]==')'&&*(S.top-1)!='('){printf("No\n");return;}if(a[i]==']'&&*(S.top-1)=='[')Pop(S,e);else if(a[i]==']'&&*(S.top-1)!='['){printf("No\n");return;}	if(a[i]=='}'&&*(S.top-1)=='{')Pop(S,e);else if(a[i]=='}'&&*(S.top-1)!='{'){printf("No\n");return;}}}if(S.top==S.base) printf("Yes\n");else printf("No\n");}

下面是这个问题的全部代码(可以直接运行)
//输入时是英文的括号这个应该不用我提醒吧!

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
#include<malloc.h>
#include<string>typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef char ElemType;
typedef struct {ElemType *base; 	// 栈底指针ElemType *top; 	// 栈顶指针int stacksize; 	// 栈空间大小
} SqStack;void InitStack(SqStack &S)
{// 构造一个空栈Sif(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType))))exit(OVERFLOW);     // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{// 销毁栈S,S不再存在free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;
}void Push(SqStack &S, ElemType e)
{if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间S.base = (ElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(ElemType));if(!S.base)exit(OVERFLOW);           // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACK_INCREMENT;}*(S.top)++ = e;
}Status Pop(SqStack &S, ElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}void praenthese_match()
{ 	SqStack S;InitStack(S);printf("输入带括号的字符串序列:");char a[100];scanf("%s",a);int l=strlen(a);char e;for(int i=0;i<l;i++){if(a[i]=='('||a[i]=='['||a[i]=='{'){Push(S,a[i]);}else{if(a[i]==')'&&*(S.top-1)=='(')Pop(S,e);else if(a[i]==')'&&*(S.top-1)!='('){printf("No\n");return;}if(a[i]==']'&&*(S.top-1)=='[')Pop(S,e);else if(a[i]==']'&&*(S.top-1)!='['){printf("No\n");return;}	if(a[i]=='}'&&*(S.top-1)=='{')Pop(S,e);else if(a[i]=='}'&&*(S.top-1)!='{'){printf("No\n");return;}}}if(S.top==S.base) printf("Yes\n");else printf("No\n");} 
int main(){praenthese_match();}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

wordpress多站点主站调用分站最新文章_企业网站SEO最新的7个优化步骤!

如果你是一个企业主&#xff0c;你有建立企业官方网站的经验&#xff0c;在2-3年的运作中&#xff0c;我相信你至少修改了一个网站&#xff0c;甚至做了一个重大的SEO策略调整。当我们开始建立一个公司的时候&#xff0c;很多时候就是认为只要我们有一个公司的网站&#xff0c;…

Azure 静态 web 应用集成 Azure 函数 API

前几次我们演示了如何通过Azure静态web应用功能发布vue跟blazor的项目(使用 Azure静态web应用Github全自动部署VUE站点、使用Azure静态Web应用部署Blazor Webassembly应用)。但是一个真正的web应用&#xff0c;总是免不了需要后台api服务为前端提供数据或者处理数据的能力。同样…

c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

来源&#xff1a;网络&#xff0c;排版整理&#xff1a;晓宇微信公众号&#xff1a;芯片之家(ID&#xff1a;chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合&#xff0c;也叫结构。结构体和其他类型基础数据类型一样&#xff0c…

c语言next的用法,C语言strchr使用之Next查找和截断想要的字符串

#include #include #include #include #include #include #include #include static char pstring[] "Hello\n"; // 这里不能是char*int main(){char tmp ;char* pstr strchr(pstring,‘l‘);printf("pstr is %s %p\n",pstr,pstr);#if 0// 搜后面的pstr …

problem b: 十进制整数转二进制_二进制的科学计数法?白话谈谈计算机如何存储与理解小数:IEEE 754...

浮点数的计算机表示(IEEE 754)&#xff0c;由 UCB 数学教授 William Kahan 主要起草。后者也因其卓越贡献于1989年获得图灵奖。计算机组成原理与汇编语言这两门课均对该内容有所讲解。与课程中直接抛出公式与概念不同&#xff0c;我想首先与各位探讨"科学计数法"这个…

分享我的写作经验

大家好&#xff0c;我是Z哥。最近一段时间&#xff0c;我面基了几个在微信上聊得不错的小伙伴。和其中的两位有聊到关于写作的事情。概括地说就是他们也想写写博客、公众号&#xff0c;但是感觉无从下手。我和他们分享了我的一些经验&#xff0c;在这里做一下总结和补充&#x…

数据结构——二叉树的最小深度算法

给定一个二叉树&#xff0c;找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明&#xff1a;叶子节点是指没有子节点的节点。 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;2 示例 2&#xff1a; 输入&#xff1a;root …

开发板实现645协议C语言,迅为-imx6ull开发板之C语言实现LED例程

第九章我们使用汇编编写了 LED 灯的实验&#xff0c;在实际开发过程中大部分还是使用 C 语言&#xff0c;汇编只是用来完成 C 语言环境的初始化&#xff0c;本章我么就来实现用汇编完成 C 语言环境的初始化&#xff0c;然后用 C 语言实现 LED 的例程。10.1 C 程序版LED例程简介…

解锁环境变量在云原生应用中的各种姿势

应用程序在某些时刻总是需要一些外挂配置&#xff0c;云原生应用的实践是在容器化之前就将应用程序配置保留在代码之外。“12-Factors App&#xff1a;Store config in the environment① 外挂配置文件&#xff1a;业务配置 appsettings.json“可以在代码中要求加载appsetting.…

python字符串截取方法_如何使用python语言中的字符串方法截取字符串

在我们使用python语言中的字符串方法时&#xff0c;可能会判断某个字符串是否以什么开头&#xff0c;可以使用什么进行截取等。下面利用几个实例说明字符串中的方法的用法&#xff0c;操作如下&#xff1a;工具/原料 python 截图工具 方法/步骤 1 第一步&#xff0c;打开python…

数据结构——二叉树的层次遍历

问题描述&#xff1a; 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例&#xff1a; 二叉树&#xff1a;[3,9,20,null,null,15,7] 返回其层次遍历结果&#xff1a; [ [3], [9,…

asp.net core 使用 TestServer 来做集成测试

asp.net core 使用 TestServer 来做集成测试Intro之前我的项目里的集成测试是随机一个端口&#xff0c;每次都真实的启动一个 WebServer&#xff0c;之前也有看到过微软文档上 TestServer 的介绍&#xff0c;当时没仔细看过以为差不多就没用&#xff0c;一直是启动了一个真正的…

微服务很香--麻辣味,但要慢慢消化

前言微服务在编程圈火的是不行不行的啦&#xff0c;可能还有很多小伙伴还没有进行微服务实操&#xff0c;但这个词&#xff0c;要说没听过、没看过&#xff0c;那小伙伴一定是假Programmer。虽然微服务很火&#xff0c;但不能盲目使用&#xff1b;先不说涉及技术和工具有多少&a…

c语言实现灰度图像阈值分割,灰度图像--图像分割 阈值处理之平均阈值

学习DIP第52天转载请标明本文出处&#xff1a;http://blog.csdn.net/tonyshengtan &#xff0c;出于尊重文章作者的劳动&#xff0c;转载请标明出处&#xff01;文章代码已托管&#xff0c;欢迎共同开发&#xff1a;https://github.com/Tony-Tan/DIPpro开篇空话好久没写博客了&…

数据结构——二叉树的双序遍历

设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结 点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树 思路&#xff1a; 1.双序遍历与中序遍历类似&#xff0c;是中序遍历的变形 2.中序遍历是指对于二叉树的每一…

python如何封装成可调用的库_Python实现打包成库供别的模块调用

1.创建python项目bricewulib2.新建test_package包并创建info1类以及print_hello方法3.为了让包的结构再复杂点&#xff0c;我们再在test_package下面新建一个test_package2包并创建Info2类以及print_hello2方法&#xff08;注意&#xff1a;这里是Info2&#xff0c;不是上面的I…

从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 如何启用预编译视图

标题&#xff1a;从零开始实现 ASP.NET Core MVC 的插件式开发(九) - 升级.NET 5及启用预编译视图作者&#xff1a;Lamond Lu地址&#xff1a;https://www.cnblogs.com/lwqlun/p/13992077.html源代码&#xff1a;https://github.com/lamondlu/Mystique适用版本&#xff1a;.NET…

数据结构——二叉树的层次遍历进阶

之前的一个博客 数据结构——二叉树的层次遍历看完这个&#xff0c;可以简单实现下面的问题 问题&#xff1a; 1.计算二叉树的最大宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值。 2.用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。 解决问题的思路…

future.cancel不能关闭线程_多线程与高并发笔记

1. 创建线程的四种方式实现Runnable 重写run方法继承Thread 重写run方法线程池创建 Executors.newCachedThreadPool()实现Callable接口2. Thread线程操作方法当前线程睡眠指定mills毫秒Thread.sleep([mills])当前线程优雅让出执行权Thread.yield()例如Thread t1, t2&#xff0c…

ANDROID手表怎么设置壁纸,表盘背景随心换 果壳智能手表换壁纸教程

在智能手机和电脑上&#xff0c;我们一般都会换一张自己喜欢的图片作为壁纸&#xff0c;当我们想把一张喜欢的图片做成果壳GEAK Watch表盘时&#xff0c;应该怎么做呢&#xff1f;其实只要简单的几个步骤&#xff0c;你就能获得独一无二的专属表盘。首先&#xff0c;打开一张你…