This is a simple implementation of a parenthesis-matcher. Given an expression, I want to find out if it is balanced.For example, the expression '{{[[()]]}}' is balanced while '{]{{}}]]' is not. I will output a simple 'NO' is the expression is not balanced and 'YES' if it is.
The algorithm is to push every opening parenthesis into a stack and match it against every closing when when pop-ed.
#include <iostream>
#include <vector>
#include <set>
#include<stack>
#include <utility>
#include <string>
bool contains(std::set<char> & inset, char elem){
return inset.find(elem) != inset.end();
}
bool charmatch(char a,char b){
return ((a == '(' && b == ')') ||
(a == '{' && b == '}') ||
(a == '[' && b == ']'));
}
void process(std::string inputArg){
std::vector<char> input(inputArg.begin(), inputArg.end());
std::set<char> openParen;
openParen.insert('(');openParen.insert('{');openParen.insert('[');
std::set<char> closeParen;
closeParen.insert(')');closeParen.insert('}');closeParen.insert(']');
std::stack<char> exprStack;
for (auto i : input){
char inputChar = i;
if (contains(openParen, inputChar))
{
exprStack.push(inputChar);
continue;
}
else if (exprStack.empty() || !charmatch(exprStack.top(),inputChar)){
std::cout << "NO" <<std::endl;
return;
}
exprStack.pop();
}
if (exprStack.empty()) {std::cout << "YES" << std::endl; return;}
else {std::cout << "NO" << std::endl; return;}
}
int main()
{
std::vector<char> input;
int num;std::string inputString;
std::cin >> num;
for (int i = 0; i < num; i++){
std::cin >> inputString;
process(inputString);
}
return 0;
}
I'm practicing Data Structures questions on HackerRank, any suggestions to improve code quality appreciated!