自己总结了两个栈实现队列的三种方法:
方法1:
入队时候:将元素压入栈s1.
出队时候:将s1的所有元素逐个(出栈并入栈到)s2中;将s1的栈顶元素弹出作为出队列元素。
之后再将s2的所有元素(出栈并入栈)到s1.
实用范围:一次出队列,一次入队列,交替出现的情况。
优化:将s1的元素(出栈并入栈到)s2中,s1的栈底元素不用入栈到深,直接作为出队元素。
方法2:
入队时候:先判断s1是否为空,如不为空,直接入栈,如果为空,将s2的所有元素(出栈并入栈)到s1,再入队。
出队时候:先判断s2是否为空,如不为空,直接弹出s2的栈顶元素,如果为空,将s1的元素(出栈并入栈)s2,并将s1的栈底元素
出队列。
实用范围:多次出队列,多次入队列,没有规律。
方法3(最高效的方法):
入队时候:将元素直接压入s1;
出队时候:
先判断s2是否为空,如不为空,直接弹出s2的栈顶元素,如果为空,将s1的元素(出栈并入栈)s2,并将s1的栈底元素
出队列。
实用范围:所有情况。
第三种方法难以理解的地方:如果最初s1的元素为(1,2,3,栈底到栈顶的顺序,入队4,这个时候出队列,1出去。s1为空,再入队列,直接放在
s1中,这个时候s2没有空,再次出栈,直接出栈,直到s2空的时候,再倒入s1,。简化了很多步骤。(此处个人仔细理解,原因是栈的特点)。