算法导论 10.1-6
题目:说明如何用两个栈来实现一个队列,并分析有关队列操作的运行时间。
-
思考
栈实现的是先入后出策略,而队列实现的是先入先出策略。用栈实现队列重点是要实现出队。
两个栈一个实现入队一个实现出队,要使出队的栈的栈顶为先入的元素,就要将入队的栈的元素弹出同时逆序压入出队的栈。
-
实现
假定两个栈
A
和B
。入队:向栈
A
中压入元素。出队:从栈
B
中弹出元素。当B
中为空时,将A中的所有元素弹出(此时得到的元素为压入的逆序)然后将这些元素压入栈B
,在对B
执行pop
,完成出队。 -
运行时间
入队:
O(1)
出队:最差情况为
O(n)
,当栈B
为空时。
算法导论 10.1-7
题目:说明如何用两个队列来实现一个栈,并分析有关栈操作的运行时间。
-
实现
假定两个队列
A
和B
。先设定A
为主队列,B
为从队列压入:主队列(
A
)元素入队。弹出:只保留最后一个主队列(
A
)入队的元素,将A
中的其他元素出队再入队从队列(B
),将主队列(A
)中最后最后一个元素出队,即为弹出的元素。此时主从队列角色互换。 -
运行时间
压入:
O(1)
弹出:
O(n)
,n
为栈中元素的个数。