UVA - 673 Parentheses Balance

本文通过解决一个关于字符串匹配的问题,详细介绍了C++中不同字符串输入方式的特点与区别,包括cin、getline()等函数的应用场景及注意事项。
/*
  本来读完题目以后的第一反应是,看上去挺简单的,直接先注释一下 "//水题"
  不久就打脸了,我发现我错的有多离谱了...
  
  先是太不仔细,没有考虑桟空的情况,存在桟空时仍 pop() 的情况,导致程序崩掉
  后来又WA,发现我有细节没有考虑到,就是输入代表组数的数字以后,应该要用 getchar()吃掉一个回车
  
  想着这样改完应该没问题了吧?结果还是WA...于是开始各处找题解了...
  
  我发现在输入字符串的时候,我是用 cin 处理的,但几乎所有题解,都是用的 getline() 
  接着,突然惊觉,好像题目有说,空串合法,而 cin 是不能处理空串的,突然我就有点冷汗直冒了,太不仔细了
  
  但是转念一想,发现一件更可怕的事情,其实我一开始就知道可以输入空串的,我真正的问题在于:
  “我居然忘记了,cin是不能输入空串的,只有 getline() 才可以!!!”
  
  想起之前做小白书上的题时,尤其 STL 那一章时,其实是各种输入格式都来了个遍的,我以为我应该已经很熟悉 cin、getline(cin, s)、cin.get() 、cin.getline()这些函数了,毕竟题目都做了那么多了...
  
  然而做到数据结构章节时,还是忘掉很多了...难怪温故知新,温故在前,知新在后。难怪说好记性不如烂笔头,好在我之前的题解都存了下来,写在了博客上。我决定以后刷题前,先找自己之前做过的题瞄几眼,看看自己还会不会做,再做新的
  
  
  --------------------------言归正传的分界线--------------------------
  
  cin:遇到空格,回车或者制表符就会结束输入,这样就导致了我们不能输入一个带有空格的字符串。
  cin.get(),cin.getline() :都表示每次读取一行字符串输入。
  
  cin.getline()和cin.get() 这两个函数都读取一行输入,直到达到换行符。然而,随后cin.getline()将丢弃换行符,而cin.get()将换行符保留在输入序列中。
  (摘自: http://blog.youkuaiyun.com/elohims/article/details/23560743 )
  
  从函数原型可以看出来cin.getline和cin.get只能接受C风格的字符串
  若想读取字符串到C++string 对象中,可以用 getline() 函数 
  
*/

/*
  查阅过的超链接的保存:
  http://blog.youkuaiyun.com/elohims/article/details/23560743
  http://bbs.youkuaiyun.com/topics/390858357
  https://zhidao.baidu.com/question/362328053.html
  http://blog.youkuaiyun.com/testing2007/article/details/5314653
  http://www.cnblogs.com/wlzy/p/5897742.html

*/
#include <iostream>
#include <string>
#include <stack>
using namespace std;
string str;
int check()
{
	getline(cin, str);
	stack<char> s;
	
	while(!s.empty()) s.pop();
	
	for (int i = 0; i < (int)str.size(); i++)
	{
		switch(str[i])
		{
			case '(':
			case '[': s.push(str[i]); break;
			case ')': if (s.empty() || s.top() != '(') return 0; s.pop(); break;
			case ']': if (s.empty() || s.top() != '[') return 0; s.pop(); break;
			default: return 0;
		}
	}
	if (s.empty()) return 1;
	return 0;
	
}
int main()
{
	int n;
	cin >> n;
	getchar();
	for (int i = 0; i < n; i++)
	{
		if (check())
		cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值