如何用两个栈实现队列
首先要清楚栈是先进后出,队列是先进先出的。这里用到是类似于数学的 “负负得正” 的思想。先用stack1将数据存进去,再依次取出stack1 pop出来的数据append进入stack2里,最后再把stack2里的数据pop出来,即可完成先进先出的效果。
class CQueue {
//定义两个数组,stack1用来存数据,stacke2用来推数据
var stack1: [Int] = []
var stack2: [Int] = []
init() {
}
func appendTail(_ value: Int) {
//存数据
stack1.append(value)
}
func deleteHead() -> Int {
// 取数据
if stack2.isEmpty{
stack2 = stack1.reversed()
stack1 = []
}
return stack2.popLast() ?? -1
//??是空合运算符,如果stack.popLast()为空,则返回-1
}
}
但在实际操作中,采用一个一个赋值再推入stack2里,leetcode显示时间时限过长,所以为了降低时间复杂度,直接用reversed()方法,将reverse过的stack1赋值给stack2,再将stack1初始化即可,也可以达到两个栈之间先取后存的逆序。