1. 如何用两个栈实现一个队列?
栈
栈的特点:先进后出,进出元素都是在同一端(栈顶)。
入栈:
出栈:
队列
队列的特点:先进先出,出入元素在不同的两端(队头和队尾)。
入队:
出队:
两个栈实现一个队列
两个栈,一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老的元素。
队列的主要操作有两个:入队和出队。在模拟入队时,新元素都被压入栈A中。
元素“1”入队:
元素“2”入队:
元素“3”入队:
元素“入队”完毕,如何让元素“出队”?
答:将栈A当中的元素按顺序出栈,再按顺序压入栈B。再从栈B当中让元素按顺序出栈。
让元素1“出队”,即将1从栈B弹出。
元素“2”出队
若此时有元素4想入队:
元素“3”出队:
元素“4”出队,需要分为两步走:
1.将元素“4”压入栈B
2.将元素“4”弹出栈B,实现出队:
2. 两个队列实现一个栈:
因为栈的性质是“后进先出”,所以需要用两个队列的元素“互捣”,从而实现栈的这一特性。
stack是栈,q1和q2是两个队列。
图(1):将元素1、2、3、4尾插入q1。
图(2):将元素1、2、3从q1头删,然后尾插进入q2,此时在q1中剩下元素4,此时再头删元素4,就相当于实现了栈顶元素的出栈。
图(3):将元素1、2从q2头删,然后尾插进入q1,此时q2中还剩下元素3,此时再头删元素3,也相当于栈顶元素的出栈。
...中间也有出栈的操作,此处忽略。
图(4):如果此时有元素5想入栈,让元素5尾插进入q1,待在元素1的后面。实现了入栈的操作。
图(5): 将元素1头删,尾插进入q2,将元素5从q1中头删,实现出栈操作。