#include "BracketCheck.h" #include "Stack.h" BracketCheck::BracketCheck() { _stack = new Stack(); } BracketCheck::~BracketCheck() { delete _stack; } BracketCheck::BracketCheck(const std::string& s) : BracketCheck() { for (char x : s) parse(std::string(1, x)); } void BracketCheck::parse(const std::string& input) { if (!_valid) return; // match brackets switch(input[0]) { case '{': case '(': case '[': { _stack->push(input); break; } case '}': case ')': case ']': { char open_bracket = _stack->pop()[0]; if (open_bracket == '{' && input[0] == '}') { // _stack->pop(); // } is used to close blocks break; } if (open_bracket == '(' && input[0] == ')') break; if (open_bracket == '[' && input[0] == ']') break; _valid = false; break; } } // check block ordering switch(input[0]) { case 'I': { break; } case 'E': { if (_stack->size() == 0) { _valid = false; break; } if (_stack->peek()[0] != 'I') _valid = false; break; } case 'D': { break; } case 'W': { if (_stack->size() > 0 && _stack->peek()[0] == 'D') { _stack->pop(); } break; } } // add blocks to stack switch(input[0]) { case 'I': case 'E': case 'D': case 'W': { _stack->push(input); } } } bool BracketCheck::input_valid() { while (_stack->size() > 0) { char remainder = _stack->pop()[0]; switch(remainder) { case '{': case '(': case '[': case 'D': return false; } } return _valid; }