summaryrefslogtreecommitdiff
path: root/algo1w4d2/BracketCheck.cpp
diff options
context:
space:
mode:
authorlonkaars <loek@pipeframe.xyz>2023-03-05 20:43:24 +0100
committerlonkaars <loek@pipeframe.xyz>2023-03-05 20:43:24 +0100
commit01bd4791cbeabcf85ea72f91c1edd0af8ac17b1f (patch)
tree5c24611842cfefd1866a1e915c5d55279aae0234 /algo1w4d2/BracketCheck.cpp
parentbdf6588d9154889d897d6b102fc32f49bf92fa7b (diff)
algo1w4d2HEADmaster
Diffstat (limited to 'algo1w4d2/BracketCheck.cpp')
-rw-r--r--algo1w4d2/BracketCheck.cpp68
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;
+}