7-7 括号匹配 (18分)

这道题考察了堆栈的应用,之前做过一道类似的题,那是多行语句判断括号是否匹配。
用一个堆栈存储左括号,一个堆栈存储右括号,每次存储完右括号之后判断两个堆栈的栈顶是否相同,如果相同,则同时出栈;如果最后两个栈都为空,则括号匹配。
这是我的初始思路,但是有漏洞,比如 [(])最后两个堆栈虽然都空了,但是括号却并不匹配。
解决办法:用一个flag标记一下,如果存在栈顶元素不匹配的话,则flag=1,如果全部匹配的话,flag=0,只有当最后两个栈空且所有栈顶元素全部匹配的话,括号才匹配。
(PS :其实右括号栈大可不必设立,只要遇到左括号就入栈,遇到右括号判断与栈顶元素是否匹配,如果匹配则出栈,不匹配,就说明不匹配。这样就避免了我思路的那种漏洞)
AC代码

#include <iostream>
#include <stack>
using namespace std;
int main() {
	string s;
	getline(cin, s);
	stack<char> l, r;
	int a = 0, b = 0;
    int flag = 0;
	for(int i = 0; i < s.length(); i++) {
		if(s[i] == '(' || s[i] == '[' || s[i] == '{') {
			a++;
			l.push(s[i]);
		}
		else if(s[i] == ')' || s[i] == ']' || s[i] == '}') {
			b++;
			r.push(s[i]);
		}
		while(!l.empty() && !r.empty()) {
			if((l.top()=='(' && r.top() == ')') || (l.top()=='[' && r.top() == ']') || (l.top()=='{' && r.top() == '}')) {
				l.pop();
				r.pop();
			}
            else{
                flag = 1;
				break;
			}
		}
	}
	cout << a << " " << b << endl;
	if(l.empty() && r.empty() && !flag) cout << "YES";
	else cout << "NO";
}

题目描述
检查一段C语言代码的小括号( )、 中括号 [ ] 和大括号{ } 是否匹配。

输入格式:
在一行中输入一段C语言代码,长度不超过1000个字符(行末以换行符结束)。

输出格式:
第一行输出左括号的数量和右括号的数量,中间以一个空格间隔。
若括号是匹配的,在第二行打印YES,否则打印NO。

输入样例1:

for(int i=0; i<v; i++){ visited[i] = 0; for(int j=0; j<v; j++) scanf("%d",&(g->Adj[i][j])); }

输出样例1:

8 8
YES

输入样例2:

for(int i=0; i<v; i++) a(i]=0;

输出样例2:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值