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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
// @Title: 用栈实现队列 (Implement Queue using Stacks)
// @Author: 15816537946@163.com
// @Date: 2019-11-12 13:05:05
// @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)
}
*/
type MyQueue struct {
	in  []int
	out []int
}

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)
	// return (len(this.out) <= 0 && len(this.in) <= 0)
}