先决条件——下推自动机,下推自动机被最终状态接受
语言 L = {0 i 1 j 2 k | i==j 或 j==k ; i , j , k >= 1} 告诉每个字符串’0′, ‘1’ 和 ‘2’ 都有一定数量的 0,然后是一定数量的 1,然后是一定数量的 2。条件是这 3 个符号中的每一个的计数应至少为 1。此语言的两个重要条件是 0 的计数应等于 1 的计数或 1 的计数应等于 2 的计数。假设该字符串以“$”结尾。
例子:
Input: 0 0 0 1 1 1 2 2 2 2 2
Here 0's = 3, 1's = 3 so i = j, 2's = 5
Output: Accepted
Input: 0 0 1 1 1 2 2 2
Here 0's = 2, 1's = 3, 2's = 3 so j = k
Output: Accepted
Input : 0 0 1 1 1 2 2 2 2
Here 0's = 2, 1's = 3, 2's = 4
Output: Not accepted
有2种解决方法。第一个用于 i==j,第二个用于 j==k。这些是:
i == j 的步骤:
- 在堆栈中输入全 0
- 当我们得到 1 作为输入时,从堆栈中弹出一个 0 并转到下一个状态。
- 如果输入为 1,则从堆栈中弹出 0。
- 如果堆栈变空(即,对应于 1 的每个 0 都已弹出,因此 i = j)并且输入为 2,则忽略它并转到下一个状态。
- 如果输入是 2 则忽略它。如果输入完成并收到 $ 则转到最终状态。
j == k 的步骤:
- 在堆栈中输入全 0
- 当我们得到 1 作为输入时,将其压入堆栈并转到下一个状态。
- 如果输入为 1,则将其压入堆栈。
- 如果输入为 2,则从堆栈中弹出 1 并转到下一个状态。
- 如果输入为 2,则从堆栈中弹出 1。如果输入完成并收到 $ 则从堆栈中弹出一个 0。
- 从堆栈中弹出所有剩余的 0。如果堆栈变空,则转到最终状态。