104 lines
No EOL
2.3 KiB
Text
104 lines
No EOL
2.3 KiB
Text
struct Node {
|
|
int p;
|
|
Node next
|
|
}
|
|
|
|
struct Stack {
|
|
int size;
|
|
Node head;
|
|
(Stack, int) -> Stack push;
|
|
(Stack) -> Stack pop;
|
|
(Stack) -> int peek
|
|
}
|
|
|
|
Stack push(Stack stack, int paren) {
|
|
var n = new Node {p = paren; next = stack.head};
|
|
return new Stack {size = stack.size + 1; head = n; push = stack.push; pop = stack.pop; peek = stack.peek};
|
|
}
|
|
|
|
Stack pop(Stack stack) {
|
|
if (stack.size == 0) {
|
|
return Stack null;
|
|
}
|
|
return new Stack{size = stack.size - 1; head = stack.head.next; push = stack.push; pop = stack.pop; peek = stack.peek};
|
|
}
|
|
|
|
int peek(Stack stack) {
|
|
if (stack.size == 0) {
|
|
return -1;
|
|
}
|
|
return stack.head.p;
|
|
}
|
|
|
|
global leftParen = 40;
|
|
global leftBracket = 91;
|
|
global leftBrace = 123;
|
|
global rightParen = 41;
|
|
global rightBracket = 93;
|
|
global rightBrace = 125;
|
|
|
|
|
|
bool isStringBalanced(string input) {
|
|
var stack = new Stack {size = 0; head = Node null; push = push; pop = pop; peek = peek};
|
|
var length = length_of_string(input);
|
|
var char_arr = array_of_string(input);
|
|
var result = new int[2*length];
|
|
var ptr = 0;
|
|
for (var i = 0; i < length; i = i + 1;) {
|
|
var char = char_arr[i];
|
|
if (char == leftParen | char == leftBracket | char == leftBrace) {
|
|
stack = stack.push(stack, char);
|
|
} else if (char == rightParen) {
|
|
var head = stack.peek(stack);
|
|
stack = stack.pop(stack);
|
|
if (head != leftParen) {
|
|
print_string("mismatch");
|
|
return false;
|
|
}
|
|
result[ptr] = leftParen;
|
|
ptr = ptr + 1;
|
|
result[ptr] = rightParen;
|
|
ptr = ptr + 1;
|
|
} else if (char == rightBracket) {
|
|
var head = stack.peek(stack);
|
|
stack = stack.pop(stack);
|
|
if (head != leftBracket) {
|
|
print_string("mismatch");
|
|
return false;
|
|
}
|
|
result[ptr] = leftBracket;
|
|
ptr = ptr + 1;
|
|
result[ptr] = rightBracket;
|
|
ptr = ptr + 1;
|
|
} else if (char == rightBrace) {
|
|
var head = stack.peek(stack);
|
|
stack = stack.pop(stack);
|
|
if (head != leftBrace) {
|
|
print_string("mismatch");
|
|
return false;
|
|
}
|
|
result[ptr] = leftBrace;
|
|
ptr = ptr + 1;
|
|
result[ptr] = rightBrace;
|
|
ptr = ptr + 1;
|
|
}
|
|
}
|
|
if (stack.size != 0) {
|
|
print_string("mismatch");
|
|
return false;
|
|
}
|
|
var finalString = new int[ptr];
|
|
for (var i = 0; i < ptr; i = i + 1;) {
|
|
finalString[i] = result[i];
|
|
}
|
|
print_string(string_of_array(finalString));
|
|
return true;
|
|
}
|
|
|
|
int program(int argc, string[] argv) {
|
|
var result = isStringBalanced(argv[1]);
|
|
if (result) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
} |