diff options
Diffstat (limited to 'algo1w4d2/BracketCheck.cpp')
-rw-r--r-- | algo1w4d2/BracketCheck.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/algo1w4d2/BracketCheck.cpp b/algo1w4d2/BracketCheck.cpp new file mode 100644 index 0000000..2584b75 --- /dev/null +++ b/algo1w4d2/BracketCheck.cpp @@ -0,0 +1,68 @@ +#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; +} |