232. 用栈实现队列

  1. //时间O1,空间On
  2. type MyQueue struct {
  3. inStack, outStack []int
  4. }
  5. //初始化队列 o
  6. func Constructor() MyQueue {
  7. return MyQueue{}
  8. }
  9. //进栈(push),增加队尾元素
  10. func (q *MyQueue) Push(x int) {
  11. q.inStack = append(q.inStack, x)
  12. }
  13. func (q *MyQueue) in2out() {
  14. for len(q.inStack) > 0 {
  15. q.outStack = append(q.outStack, q.inStack[len(q.inStack)-1])
  16. q.inStack = q.inStack[:len(q.inStack)-1]
  17. }
  18. }
  19. //出队(pop),删除队首元素
  20. func (q *MyQueue) Pop() int {
  21. if len(q.outStack) == 0 {
  22. q.in2out()
  23. }
  24. x := q.outStack[len(q.outStack)-1]
  25. q.outStack = q.outStack[:len(q.outStack)-1]
  26. return x
  27. }
  28. //取队首元素(peek),查询队首元素
  29. func (q *MyQueue) Peek() int {
  30. if len(q.outStack) == 0 {
  31. q.in2out()
  32. }
  33. x := q.outStack[len(q.outStack)-1]
  34. return x
  35. }
  36. //判断栈是否为空(empty)
  37. func (q *MyQueue) Empty() bool {
  38. return len(q.inStack) == 0 && len(q.outStack) == 0
  39. }
//牛客网答案,感觉好简洁
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弹出结果
}