编写方法isL(w)
的伪代码,它使用1个堆栈和1个队列来检查字符串w
是否是L的元素
L = {a^n⋅b^n⋅c^m⋅d^m | n≥1, m≥1} U {a^n⋅b^m⋅c^m⋅d^n | n≥1, m≥1}
(a ^ n是a的n次幂)
您可以假设已经实现了堆栈和队列,并将它们与变量stack
和queue
一起使用。
我的代码只回答了这个问题的一半:
isL(w) {
for (each char ch in w) {
if (ch == 'a' || ch == 'c') {
stack.push( ch );
}
else if (ch == 'b' || ch == 'd') {
queue.enqueue( ch );
}
else return false; // no other letter than a,b,c,d
}
while (!queue.isEmpty()) {
if (stack.pop() == 'c' && queue.dequeue() == 'b')
continue;
else if (stack.pop() == 'a' && queue.dequeue() == 'd')
continue;
else
return false;
}
return true;
}
虽然我的目标是后一个子集,但后者也是错误的。
如何实现同时检查前一个子集的完整答案?
答案 0 :(得分:1)
isL(w) {
if (w[0] != 'a') return false
stack.push('a')
for ch in w{
if (!stack.isEmpty()) {
if (ch == 'a') stack.push(ch)
else if (ch == 'b') stack.pop()
else return false
}
else {
if (ch == 'c') queue.push(ch)
else if (!queue.isEmpty() && ch == 'd') queue.dequeue()
else return false
}
}
return true
}