华为2018届校园招聘笔试
时间20170712
笔试题目
01 括号匹配
//01 括号匹配
#define _CRT_SECURE_NO_WARNINGS
/*
括号匹配
给定一个字符串,里边可能包含“()”、“[]”、“{}”三种括号,请编写程序检查该字符串中的括号是否成对出现,且嵌套关系正确。
输出:true:若括号成对出现且嵌套关系正确,或该字符串中无括号字符;
false:若未正确使用括号字符。
实现时,无需考虑非法输入。
输入描述:
输入为:
字符串
例子:(1+2)/(0.5+1)
输出描述:
输出为:
字符串
例子:true
*/
//这是josan的AC代码,仅供参考。
//程序有什么bug,有什么可以改进的地方,欢迎私信交流或者留言回复。
//共同学习,共同进步。
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
bool isLeft(char a)
{
return (a == '(') || (a == '[') || (a == '{');
}
bool isRight(char a)
{
return (a == ')') || (a == ']') || (a == '}');
}
bool isMatch(char a, char b)
{
if(a == '('&&b == ')')
{
return true;
}
else if(a == '['&&b == ']')
{
return true;
}
else if(a == '{'&&b == '}')
{
return true;
}
return false;
}
int main()
{
#if 0
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
string str;
vector<char> cvec;
cvec.reserve(200);
while(cin >> str)
{
auto iter = str.begin();
for(; iter != str.end(); ++iter)
{
//左括号直接进栈
if(isLeft(*iter))
{
cvec.push_back(*iter);
}
//如果出现右括号
else if(isRight(*iter))
{
//不合理情况1: 栈空的话,直接退出 这里情况一开始忘记考虑,但是华为机试仍然100%通过
if(cvec.empty())
{
break;
}
char c = cvec.back();
cvec.pop_back();
//不合理情况2:判断栈中左括号与现在的右括号是否匹配
if(!isMatch(c, *iter))
{
break;
}