1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
// @Title: 用栈实现队列 (Implement Queue using Stacks)
// @Author: 15816537946@163.com
// @Date: 2020-06-25 07:15:36
// @Runtime: 0 ms
// @Memory: 1.9 MB
/*
 * @lc app=leetcode.cn id=232 lang=golang
 *
 * [232] 用栈实现队列
 *
 * https://leetcode-cn.com/problems/implement-queue-using-stacks/description/
 *
 * algorithms
 * Easy (60.83%)
 * Likes:    89
 * Dislikes: 0
 * Total Accepted:    17K
 * Total Submissions: 28K
 * Testcase Example:  '["MyQueue","push","push","peek","pop","empty"]\n[[],[1],[2],[],[],[]]'
 *
 * 使用栈实现队列的下列操作:
 *
 *
 * push(x) -- 将一个元素放入队列的尾部。
 * pop() -- 从队列首部移除元素。
 * peek() -- 返回队列首部的元素。
 * empty() -- 返回队列是否为空。
 *
 *
 * 示例:
 *
 * MyQueue queue = new MyQueue();
 *
 * queue.push(1);
 * queue.push(2);
 * queue.peek();  // 返回 1
 * queue.pop();   // 返回 1
 * queue.empty(); // 返回 false
 *
 * 说明:
 *
 *
 * 你只能使用标准的栈操作 -- 也就是只有 push to top, peek/pop from top, size, 和 is empty
 * 操作是合法的。
 * 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
 * 假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。
 *
 *
 */

type MyQueue struct {
	in  []int
	out []int
}

// init
func Constructor() MyQueue {
	return MyQueue{}
}

func (this *MyQueue) pushToPop() {
	if len(this.out) <= 0 {

		for _, val := range this.in {
			this.out = append(this.out, val)
		}

		// 清空in-stack
		this.in = nil
	}

}

func (this *MyQueue) Push(x int) {
	this.in = append(this.in, x)
	// 如果out-stack为空,将in-stack数据弹入到out-stack
	this.pushToPop()
}

func (this *MyQueue) Pop() int {
	if len(this.out) <= 0 && len(this.in) <= 0 {
		return 0
	}
	this.pushToPop()
	ret := this.out[0]
	this.out = this.out[1:]
	return ret
}

func (this *MyQueue) Peek() int {
	if len(this.out) <= 0 && len(this.in) <= 0 {
		return 0
	}
	this.pushToPop()
	return this.out[0]
}

func (this *MyQueue) Empty() bool {
	return (len(this.out) <= 0 && len(this.in) <= 0)
}