题目
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):
实现 MyQueue 类:
* void push(int x) 将元素 x 推到队列的末尾
* int pop() 从队列的开头移除并返回元素
* int peek() 返回队列开头的元素
* boolean empty() 如果队列为空,返回 true ;否则,返回 false
说明:
* 你 只能 使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
* 你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
算法实现
class MyQueue {
private var inStack = [Int]()
private var outStack = [Int]()
init() {
}
func push(_ x: Int) {
while outStack.isEmpty == false {
inStack.append(outStack.popLast()!)
}
inStack.append(x)
while inStack.isEmpty == false {
outStack.append(inStack.popLast()!)
}
}
func pop() -> Int {
outStack.popLast()!
}
func peek() -> Int {
outStack.last!
}
func empty() -> Bool {
outStack.isEmpty
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* let obj = MyQueue()
* obj.push(x)
* let ret_2: Int = obj.pop()
* let ret_3: Int = obj.peek()
* let ret_4: Bool = obj.empty()
*/
分析&注意点
- 为了满足队列的 FIFO 的特性,我们需要用到两个栈,用它们其中一个来反转元素的入队顺序,用另一个来存储元素的最终顺序;
- Swift中
last和popLast()的返回值是可选类型;