版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42449444/article/details/100109120
括号配对问题。
给定一个字符串S,请检查该字符串的括号是否配对,只含有"{", "}", "[", "]", "(", ")"。
若配对,返回true;若不配对,返回false。
abcd(])[efg
false
唯品会校招水题。自定义函数matched来判断字符串中的括号是否配对。用栈来存储左括号,每次遇到右括号且栈非空时,判断栈顶的左括号是否与之匹配,若匹配则出栈,若不匹配则return false,直到字符串遍历完成return true。
#include <bits/stdc++.h>
using namespace std;
bool matched(string paren,int l,int r) //表达式括号匹配检查
{
stack<char> s; //使用栈来记录已发现单尚未匹配的左括号
for(int i = l; i < r; i++) //逐一检查当前字符
{
switch(paren[i])
{
case '(': case '[': case'{': s.push(paren[i]); break; //左括号直接进栈
case ')':
if(s.empty() || s.top()!='(')
{
return false;
}
s.pop();
break; //右括号若与栈顶失配则表达式不匹配
case ']':
if(s.empty() || s.top()!='[')
{
return false;
}
s.pop();
break;
case '}':
if(s.empty() || s.top()!='{')
{
return false;
}
s.pop();
break;
default: break; //非括号字符一律忽略
}
}
return s.empty(); //整个表达式扫描完后,若栈中仍有残留的括号,则表达式不匹配,否则栈空匹配
}
int main()
{
string str;
cin >> str;
int len = str.length();
printf("%s\n", matched(str,0,len)?"true":"false");
return 0;
}