形式语言:使用一个堆栈和一个队列检查语言

时间:2018-04-21 10:57:41

标签: data-structures stack queue

编写方法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次幂)

您可以假设已经实现了堆栈和队列,并将它们与变量stackqueue一起使用。

我的代码只回答了这个问题的一半:

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

虽然我的目标是后一个子集,但后者也是错误的。

如何实现同时检查前一个子集的完整答案?

1 个答案:

答案 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
}