C++ 栈基本操作练习题 [括号配对问题]

1 篇文章 0 订阅
1 篇文章 0 订阅
文章描述了一种检查括号是否正确配对的算法问题,输入为多组括号序列,需要通过栈数据结构判断括号是否匹配。当遇到右括号时,检查栈顶的左括号是否与其匹配,匹配则出栈,不匹配则返回错误。最后栈为空则表示括号配对成功。给出的解题思路和代码示例展示了如何实现这一功能。
摘要由CSDN通过智能技术生成

题目描述

查看题目信息

现在有多行括号序列,请你检查这行括号是否配对。

输入格式

第一行输入一个数N(0<N<=100),表示有N组测试数据。

后面的N行输入多组输入数据,每组输入数据都是一个字符串S(S的长度小于10000,且S不是空串)。

数据保证S中只含有"[","]","(",")"四种字符。

输出格式

每组输入数据的输出占一行,如果该字符串中所含的括号是配对的,则输出Yes,如果不配对则输出No.

样例输入

3
[(])
(])
([[]()])

样例输出

No
No
Yes

解题思路

一个后括号一定对应一个前括号且一层套一层,如果来了一个后括号没有前括号那就错误。

先进去的字符就会后出来,这种操作最好使用栈。

例1:

        字符串为"([])"

        它的出入栈步骤为

        1.(         …………左括号,无操作

        2.([        …………左括号,无操作

        3.(         …………与左中括号配对成功将左中括号出栈

        4.          …………与左小括号配对成功将左小括号出栈

        最后栈为空,成立。

例1:

        字符串为"([])"

        它的出入栈步骤为

        1.(         …………左括号,无操作

        2.([        …………左括号,无操作

        3.(         …………与左中括号配对成功将左中括号出栈

        4.          …………与左小括号配对成功将左小括号出栈

        最后栈为空,成立。

例2:

        字符串为"([]"

        它的出入栈步骤为

        1.(         …………左括号,无操作

        2.([        …………左括号,无操作

        3.(         …………与左中括号配对成功将左中括号出栈

        最后栈有字符,不成立。

例3:

        字符串为"([)]"

        它的出入栈步骤为

        1.(         …………左括号,无操作

        2.([        …………左括号,无操作

        3.([)        …………右小括号无法配对左小括号,不成立

代码实现

#include<bits/stdc++.h>//此处用的头文件比较多
/*
#include<iostream>
#include<stack>
#include<string>
*/
using namespace std;
bool chk();//本人习惯
string str;//每次输入的字符串
int main(){
	int n;
	cin>>n;//输入字符串个数
	while(n--){
		cin>>str;//输入字符串
		if(chk()) cout<<"Yes\n";//不用过多解释
		else cout<<"No\n";
	}
	return 0;
}
bool chk(){ //为了让主函数整洁
	if(str.size()%2) return 0;   //如果可以配对那么字符串的长度是偶数
	stack<char> s; //一个栈,用于判断//
	for(int i=0;i<=str.size()-1;i++){ //遍历每一个字符
		if(str[i]=='('||str[i]=='[') s.push(str[i]); //如果是左括号直接入栈
		else if(str[i]==')'){//如果是右小括号,进行判断
			if(s.empty()||s.top()!='(') return 0;//如果栈空或上面不是左小括号说明不成立
			else s.pop();//否则为真,把左右小括号全部消除
		}
		else if(str[i]==']'){//与小括号同理
			if(s.empty()||s.top()!='[') return 0;
			else s.pop();
		}
	}
	return s.empty(); //如果成立,那么栈应为空
}

样例测试

 提交结果

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值