使用 Python 檢查一個佇列是否可以透過棧排序成另一個佇列
假設我們有一個佇列,其中包含前 n 個自然數(未排序)。我們必須檢查給定的佇列元素是否可以透過使用棧在另一個佇列中按非遞減順序排序。我們可以使用以下操作來解決此問題:
- 將元素壓入或彈出棧
- 從給定佇列中刪除元素。
- 將元素插入另一個佇列。
因此,如果輸入類似 Que = [6, 1, 2, 3, 4, 5],則輸出將為 True,因為我們可以從 Que 中彈出 6,然後將其壓入棧中。現在從 Que 中彈出所有剩餘元素到另一個佇列,然後從棧中彈出 6 並將其壓入第二個佇列,因此新佇列中的所有元素都將按非遞減順序排序。
為了解決這個問題,我們將遵循以下步驟:
- n := 佇列的大小
- stk := 一個新的棧
- exp_val := 1
- front := null
- 當佇列不為空時,執行以下操作
- front := 佇列的第一個元素
- 從佇列中刪除第一個元素
- 如果 front 等於 exp_val,則
- exp_val := exp_val + 1
- 否則,
- 如果 stk 為空,則
- 將 front 壓入 stk
- 否則,當 stk 不為空且棧頂 < front 時,則
- 返回 False
- 否則,
- 將 front 壓入 stk
- 如果 stk 為空,則
- 當 stk 不為空且棧頂等於 exp_val 時,執行以下操作
- 從 stk 中彈出
- exp_val := exp_val + 1
- 如果 exp_val - 1 等於 n 且 stk 為空,則
- 返回 True
- 返回 False
讓我們看看以下實現以獲得更好的理解:
示例
from queue import Queue def solve(que): n = que.qsize() stk = [] exp_val = 1 front = None while (not que.empty()): front = que.queue[0] que.get() if (front == exp_val): exp_val += 1 else: if (len(stk) == 0): stk.append(front) elif (len(stk) != 0 and stk[-1] < front): return False else: stk.append(front) while (len(stk) != 0 and stk[-1] == exp_val): stk.pop() exp_val += 1 if (exp_val - 1 == n and len(stk) == 0): return True return False que = Queue() items = [6, 1, 2, 3, 4, 5] for i in items: que.put(i) print(solve(que))
輸入
[6, 1, 2, 3, 4, 5]
輸出
True
廣告