CS153/hw6/hw5programs/ssumit_balancedparens.oat
jmug cfe502c598 Add all the assignment code.
Signed-off-by: jmug <u.g.a.mariano@gmail.com>
2025-01-24 18:59:28 -08:00

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;
}