数据结构 括号匹配题解(深学思维)

前言:

这篇文章是为了帮助一些

像我这样的菜鸟

找到简单的题解

问题描述:

描述

假设表达式中允许包含圆括号和方括号两种括号,其嵌套的顺序随意,如([]())或[([][])]等为正确的匹配,[(])或([]()或(()))均为错误的匹配。

本题的任务是检验一个给定表达式中的括号是否正确匹配。

输入一个只包含圆括号和方括号的字符串,判断字符串中的括号是否匹配,匹配就输出“OK”,不匹配就输出“Wrong”。

输入描述

一行字符,只含有圆括号和方括号,个数小于255。

输出描述

匹配就输出一行文本“OK”,不匹配就输出一行文本“Wrong”。

用例输入 1 

[(])

用例输出 1 

Wrong

问题解析:

这是基本数据结构的一道水题

需要用到栈

一个个推入栈并判断匹配

最后输出

栈的简介:

栈 stack<>

1、栈(Stack)是一种线性存储结构,它具有如下特点:

(1)栈中的数据元素遵守“先进后出"(First In Last Out)的原则,简称FILO结构。(后进先出的叫法,也是可以的)

(2)限定只能在栈顶进行插入和删除操作。

2、栈的相关概念:

(1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端称为栈底。

(2)压栈:栈的插入操作,叫做进栈,也称压栈、入栈。

(3)弹栈:栈的删除操作,也叫做出栈。

3、栈的常用操作为:

(1)弹栈,通常命名为pop

(2)压栈,通常命名为push

(3)求栈的大小

(4)判断栈是否为空

(5)获取栈顶元素的值

栈的函数

栈的函数
s.empty();如果栈为空则返回true, 否则返回false
s.size();返回栈中元素的个数
s.top();返回栈顶元素, 但不删除该元素
s.pop(); 弹出栈顶元素, 但不返回其值
s.push();将元素压入栈顶

stack栈:相关资料


题目代码:

先写好变量一切的开始

stack<char> s;//定义一个栈
string a;//输入的字符串

变量比较少

然后是判定匹配字符的函数

bool ac()//一个吉利的名字
{
	if(a.size()%2) return false;//如果是奇数则肯定多一个字符匹配失败
	for(int i=0;i<a.size();i++)
	{
		if(a[i]=='[' || a[i]=='(') s.push(a[i]);//如果为前半段则压入栈
		else if(a[i]==']')//入果为 ] 则判断前面是不是 [
		{
			if(s.empty() || s.top()!='[') return false;//前面不是 [ 匹配失败
			else s.pop();//匹配成功
		}
		else if(a[i]==')')//入果为 } 则判断前面是不是 {
		{
			if(s.empty() || s.top()!='(') return false;//前面不是 { 匹配失败
			else s.pop();//匹配成功
		}
	}
	return s.empty();//如果没剩余说明匹配成功
}

最后是主函数部分

照题目输入输出即可

int main()
{
	cin>>a;//读入字符串
	if(ac()) cout<<"OK"<<endl;//如果匹配成功 输出"OK"
	else cout<<"Wrong"<<endl;//如果匹配失败 输出"Wrong"
	return 0;
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
stack<char> s;//定义一个栈
string a;//输入的字符串
bool ac()//一个吉利的名字
{
	if(a.size()%2) return false;//如果是奇数则肯定多一个字符匹配失败
	for(int i=0;i<a.size();i++)
	{
		if(a[i]=='[' || a[i]=='(') s.push(a[i]);//如果为前半段则压入栈
		else if(a[i]==']')//入果为 ] 则判断前面是不是 [
		{
			if(s.empty() || s.top()!='[') return false;//前面不是 [ 匹配失败
			else s.pop();//匹配成功
		}
		else if(a[i]==')')//入果为 } 则判断前面是不是 {
		{
			if(s.empty() || s.top()!='(') return false;//前面不是 { 匹配失败
			else s.pop();//匹配成功
		}
	}
	return s.empty();//如果没剩余说明匹配成功
}
int main()
{
	cin>>a;//读入字符串
	if(ac()) cout<<"OK"<<endl;//如果匹配成功 输出"OK"
	else cout<<"Wrong"<<endl;//如果匹配失败 输出"Wrong"
	return 0;
}

题目测评:

样例通过

成功AC 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值