#include <iostream>
#include <vector>
#include <string>
#include <stack>
using namespace std;
vector<string> braces(vector<string> inputList);
bool isbracesBalanced(string braces);
int main()
{
vector<string> input;
input.push_back("[[(())]]");
input.push_back("[[((]]");
input.push_back("[[(())]]");
vector<string> output = braces(input);
for(auto s : output)
{
cout<<s<<endl;
}
return 0;
}
vector<string> braces(vector<string> inputList)
{
char x;
vector<string> output;
for (size_t string_idx = 0; string_idx < inputList.size(); string_idx++)
{
bool balanced = isbracesBalanced( inputList[string_idx]);
output.push_back(balanced ? "YES" : "NO");
}
return output;
}
bool isbracesBalanced(string braces)
{
stack<char> bracesOrder;
char topChar;
for (int idx=0; idx<braces.length(); idx++)
{
if (braces[idx]=='('||
braces[idx]=='['||
braces[idx]=='{')
{
bracesOrder.push(braces[idx]);
continue;
}
if (bracesOrder.empty())
return false;
topChar = bracesOrder.top();
bracesOrder.pop();
switch (braces[idx])
{
case ')':
if (topChar=='{' || topChar=='[')
return false;
break;
case '}':
if (topChar=='(' || topChar=='[')
return false;
break;
case ']':
if (topChar =='(' || topChar == '{')
return false;
break;
}
}
// handle case where opening braces are bigger than enclosing
return (bracesOrder.empty());
}