#1598. 括号匹配

本蒟蒻的第九篇题解,望大家多多见谅!

P a r t Part Part 1 1 1 读题
题目描述:

为了让幻想乡的妖怪们更富有智慧,贤者八云紫决定在幻想乡开设计算机基础、C语言程序设计、数据结构等课程。琪露诺听说课上可以玩电脑,于是兴冲冲地把大妖精拉上,报名参加了C语言基础课程。
琪露诺当然什么都听不懂(毕竟她的智商只有⑨),所以每次上课她都全程跟大妖精玩昆特牌,下课后请其他妖怪帮她写作业。⑨个月后她把雾之湖所有的妖怪和妖精都委托了一遍,现在她找不到别人,只能再次找你了。
这次的作业是这样的:给你一个括号序列,其中有圆括号()、方括号[]、花括号{}和尖括号<>,请问该序列是否合法。
合法的括号序列可以按如下方式递归定义:
(1)空序列是合法的;
(2)若A和B是合法的括号序列,则AB(将B连接到A的后方)也是合法的括号序列;
(3)若A是合法的括号序列,则在两端添加一对括号,( A )、[ A ]、{ A }、< A >
都是合法的括号序列。

输入格式:

第一行是一个正整数 T T T,表示数据组数;
之后 T T T行,每行包含一个字符串,表示待判断的括号序列。保证字符串非空且只会包含()[]{}<>这8种字符。

输出格式:

对于每组数据,若该序列是合法的则输出 Y e s Yes Yes,否则输出 N o No No
输入样例:

3
(([]))
([(]))
{<><>}<{{(}}>)

输出样例:

Yes
No
No

P a r t Part Part 2 2 2 思路

我们要对左右括号值匹配,如果相同输出“ Y E S YES YES”,不同输出“ N O NO NO”。

P a r t Part Part 3 3 3 代码

栈:

#include<bits/stdc++.h>
using namespace std;
char str[1000005],stk[1000005];
int main(){
	int n,top=0;
	scanf("%d",&n);
	for(int k=1;k<=n;k++){
		top=0;
	scanf("%s",str);
	int l=strlen(str);
	for(int i=0;i<=l;i++){
		if(str[i]=='('){
			stk[++top]=1;
		}
		if(str[i]=='['){
			stk[++top]=2;
		}
		if(str[i]=='<'){
			stk[++top]=3;
		}
		if(str[i]=='{'){
			stk[++top]=4;
		}
		if(str[i]==')'){
			if(top>0){
				if(stk[top]==1){
					stk[top]==0;
			        top--;
				}
				
			}
			else {
				printf("No\n");
				break;
			}
		}
			if(str[i]==']'){
			if(top>0){
				if(stk[top]==2){
				stk[top]==0;
			    top--;	
				}
				else{
					printf("No\n");
					break;
				}
			}
		}
		if(str[i]=='>'){
			if(top>0){
				if(stk[top]==3){
					stk[top]==0;
			        top--;
				}
				
			}
			else {
				printf("No\n");
				break;
			}
		}
		if(str[i]=='}'){
			if(top>0){
				if(stk[top]==4){
					stk[top]==0;
			        top--;
				}
			}
			else {
				printf("No\n");
				break;
			}
		}
		if(str[i]==str[l]){
			if(top==0){
				printf("Yes\n");
				break;
			}
			else{
				printf("No\n");
				break;
			}
		}
	}
	}
	return 0;
}

P a r t Part Part 4 4 4 总结

本题考查:
如果遇到左括号
如果栈空,则入栈。
如果栈不空
如果当前左括号优先级小于等于栈顶左括号优先级,左括号入栈。
否则不匹配。
如果遇到右括号
如果栈空,则不匹配。
如果栈不空
看栈顶左括号能否与该右括号配对,如果配对则出栈
否则不匹配。

看完题解后,会不会感到很简单呢?赶快去试试吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值