这个代码是我自己写的
是对QDU周强老师的一个题写出来的
(())四个字符标号为1234,我们让24配对,13也是配对的,这个道理,我们应该明确
算法逻辑:将字符串中的左右括号的数组下标分别存放在两个stack中,我们可以知道,栈顶元素的值就是该栈的最大值,要想配对,左括号的下标一定要小于右括号的下标,所以,一旦有一个左括号的下标大于了右括号栈顶的下标,就一定没有与其匹配的括号,即这段字符串的括号是不匹配的
#include<cstdio>
#include<iostream>
#include<stack>
#include<string>
using namespace std;
stack<int> small_left;
stack<int> small_right;
stack<int> mid_left;
stack<int> mid_right;
stack<int> big_left;
stack<int> big_right;
string line;
bool Handle(int c)
{
if(c == 1)
{
int left_len;
int right_len;
left_len = small_left.size();
right_len = small_right.size();
if(left_len == right_len)
{
bool flag = true;
while(!small_left.empty())
{
if(small_left.top() > small_right.top())
{
flag = false;
break;
}
else
{
small_left.pop();
small_right.pop();
}
}
return flag;
}
else return false;
}
else if(c==2)
{
int left_len;
int right_len;
left_len = mid_left.size();
right_len = mid_right.size();
if(left_len == right_len)
{
bool flag = true;
while(!mid_left.empty())
{
if(mid_left.top() > mid_right.top())
{
flag = false;
break;
}
else
{
mid_left.pop();
mid_right.pop();
}
}
return flag;
}
else return false;
}
else
{
int left_len;
int right_len;
left_len = big_left.size();
right_len = big_right.size();
if(left_len == right_len)
{
bool flag = true;
while(!big_left.empty())
{
if(big_left.top() > big_right.top())
{
flag = false;
break;
}
else
{
big_left.pop();
big_right.pop();
}
}
return flag;
}
else return false;
}
}
int main()
{
int left = 0;
int right = 0;
getline(cin,line);
for(int i = 0; i < line.length(); i++)
{
if(line[i] == '(')
{
small_left.push(i);
left++;
}
else if(line[i] == ')')
{
small_right.push(i);
right++;
}
else if(line[i] == '[')
{
mid_left.push(i);
left++;
}
else if(line[i] == ']')
{
mid_right.push(i);
right++;
}
else if(line[i] == '{')
{
big_left.push(i);
left++;
}
else if(line[i] == '}')
{
big_right.push(i);
right++;
}
}
bool flag1 = Handle(1);
bool flag2 = Handle(2);
bool flag3 = Handle(3);
cout<<left<<" "<<right<<endl;
if(flag1 && flag2 && flag3)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
return 0;
}
但是这段代码可能存在小bug,错了一个点,过几天我再来填坑