//时间O1,空间On
type MyQueue struct {
inStack, outStack []int
}
//初始化队列 o
func Constructor() MyQueue {
return MyQueue{}
}
//进栈(push),增加队尾元素
func (q *MyQueue) Push(x int) {
q.inStack = append(q.inStack, x)
}
func (q *MyQueue) in2out() {
for len(q.inStack) > 0 {
q.outStack = append(q.outStack, q.inStack[len(q.inStack)-1])
q.inStack = q.inStack[:len(q.inStack)-1]
}
}
//出队(pop),删除队首元素
func (q *MyQueue) Pop() int {
if len(q.outStack) == 0 {
q.in2out()
}
x := q.outStack[len(q.outStack)-1]
q.outStack = q.outStack[:len(q.outStack)-1]
return x
}
//取队首元素(peek),查询队首元素
func (q *MyQueue) Peek() int {
if len(q.outStack) == 0 {
q.in2out()
}
x := q.outStack[len(q.outStack)-1]
return x
}
//判断栈是否为空(empty)
func (q *MyQueue) Empty() bool {
return len(q.inStack) == 0 && len(q.outStack) == 0
}
//牛客网答案,感觉好简洁
package main
var stack1 [] int
var stack2 [] int
func Push(node int) {
stack1 = append(stack1, node) //直接压栈,stack1无需判断是否栈满了,无长度限制
}
func Pop() int{
if len(stack2) == 0 { //stack2为空时,移动stack1的内容到stack2
for i := 0; i < len(stack1); i++ { //将stack1的数据,从后往前,全部移到stack2中
stack2 = append(stack2, stack1[len(stack1)-1-i])
}
stack1 = []int{} //stack1置空
}
res := stack2[len(stack2)-1] //获取最后一个位置作为栈顶元素
stack2 = stack2[:len(stack2)-1] //左闭右开,取得0~n-2的元素作为新的切片
return res //stack2弹出结果
}