Computer has a single LIFO stack containing ?xed precision unsigned integers (so each integer is subject to over?ow problems) but which has unbounded depth (so the stack itself never over?ows).
In your program you should limit yourself to accessing this with methods like push(i), top(), pop(), and a predicate like empty?(). These will push a value into the stack, return the value stored in the top of the stack (the most recent value pushed), discard the top of stack,
and test the stack for empty, respectively. Don't forget that you have no storage outside of the stack, so you need to work directly with the values in the stack-you can't pull a value out of the stack and assign it to some other variable. Similarly, while you can call input() as
often as you wish, the only way to store the value of the input is to push it directly into the stack (e.g., push(input())).
(a) Sketch an algorithm to recognize the language of strings of the form wcwr where w is any sequence of ‘a's and ‘b's and wr is exactly the same sequence of ‘a's and ‘b's in reverse order, so these are all palindromes over the alphabet {a, b, c} in which 'c' occurs only as the middle symbol. It includes strings like:
abbbcabbb aca ababacababa c
(In the last example there are no ‘a's or ‘b's, the "re?ected" string is empty.)
(b) What is your intuition about recognizing this language within the second model (i.e., using just a single counter)?
(c) What is your intuition about the possibility of recognizing the language of strings of the form wcw, where w is an arbitrary string of ‘a's and ‘b's? This is the set of strings made up of any sequence of ‘a's and ‘b's followed by a 'c' and then exactly the same sequence of ‘a's and ‘b's in exactly the same order; it's referred to as the (deterministic) copy language.