1. 程式人生 > >[Swift]LeetCode232. 用棧實現佇列 | Implement Queue using Stacks

[Swift]LeetCode232. 用棧實現佇列 | Implement Queue using Stacks

Implement the following operations of a queue using stacks.

  • push(x) -- Push element x to the back of queue.
  • pop() -- Removes the element from in front of queue.
  • peek() -- Get the front element.
  • empty() -- Return whether the queue is empty.

Example:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);  
queue.peek();  // returns 1
queue.pop();   // returns 1
queue.empty(); // returns false

Notes:

  • You must use only standard operations of a stack -- which means only push to toppeek/pop from topsize, and is empty operations are valid.
  • Depending on your language, stack may not be supported natively. You may simulate a stack by using a list or deque (double-ended queue), as long as you use only standard operations of a stack.
  • You may assume that all operations are valid (for example, no pop or peek operations will be called on an empty queue).

使用棧實現佇列的下列操作:

  • 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 toppeek/pop from topsize, 和 is empty 操作是合法的。
  • 你所使用的語言也許不支援棧。你可以使用 list 或者 deque(雙端佇列)來模擬一個棧,只要是標準的棧操作即可。
  • 假設所有操作都是有效的 (例如,一個空的佇列不會呼叫 pop 或者 peek 操作)。

8ms

 1 class MyQueue {
 2     
 3     var input = [Int]()
 4     var output = [Int]()
 5     
 6     func push(_ x: Int) {
 7         input.append(x)
 8     }
 9     
10     func pop() -> Int {
11         if output.isEmpty {
12             inputToOutput()
13         }
14         return output.removeLast()
15     }
16     
17     func inputToOutput() {
18         while !input.isEmpty {
19             output.append(input.removeLast())
20         }
21     }
22     
23     func peek() -> Int {
24         if output.isEmpty {
25             inputToOutput()
26         }
27         return output.last!
28     }
29     
30     func empty() -> Bool {
31         return input.isEmpty && output.isEmpty
32     }
33 }
34 
35 /**
36  * Your MyQueue object will be instantiated and called as such:
37  * let obj = MyQueue()
38  * obj.push(x)
39  * let ret_2: Int = obj.pop()
40  * let ret_3: Int = obj.peek()
41  * let ret_4: Bool = obj.empty()
42  */
43  

12ms

 1 class MyQueue {
 2 
 3     private var oldStack: [Int]
 4     private var newStack: [Int]
 5     /** Initialize your data structure here. */
 6     init() {
 7         oldStack = [Int]()
 8         newStack = [Int]()
 9     }
10     
11     /** Push element x to the back of queue. */
12     func push(_ x: Int) {
13       newStack.append(x)
14     }
15     
16     /** Removes the element from in front of queue and returns that element. */
17     func pop() -> Int {
18                 shiftStack()
19 
20       return oldStack.removeLast()
21     }
22     
23     /** Get the front element. */
24     func peek() -> Int {
25         shiftStack()
26       return oldStack.last!
27     }
28     
29     /** Returns whether the queue is empty. */
30     func empty() -> Bool {
31       return oldStack.isEmpty && newStack.isEmpty
32     }
33     private func shiftStack() {
34         if oldStack.isEmpty {
35             while !newStack.isEmpty {
36              oldStack.append(newStack.removeLast())
37             }
38         }
39     }
40 }
41 
42 /**
43  * Your MyQueue object will be instantiated and called as such:
44  * let obj = MyQueue()
45  * obj.push(x)
46  * let ret_2: Int = obj.pop()
47  * let ret_3: Int = obj.peek()
48  * let ret_4: Bool = obj.empty()
49  */
50  

12ms

 1 class Stack {
 2     
 3     private var nums: [Int] = []
 4     
 5     var isEmpty: Bool {
 6         return nums.isEmpty
 7     }
 8     
 9     func push(_ x: Int) {
10         nums.append(x)
11     }
12     
13     func pop() -> Int? {
14         return nums.popLast()
15     }
16     
17     func peek() -> Int? {
18         return nums.last
19     }
20     
21 }
22 
23 class MyQueue {
24     
25     private let stack = Stack()
26     private let stack2 = Stack()
27 
28     /** Initialize your data structure here. */
29     init() {
30         
31     }
32     
33     /** Push element x to the back of queue. */
34     func push(_ x: Int) {
35         stack.push(x)
36     }
37     
38     /** Removes the element from in front of queue and returns that element. */
39     func pop() -> Int {
40         if stack2.isEmpty {
41             while let num = stack.pop() {
42                 stack2.push(num)
43             }
44         }
45         
46         return stack2.pop() ?? 0
47     }
48     
49     /** Get the front element. */
50     func peek() -> Int {
51         if stack2.isEmpty {
52             while let num = stack.pop() {
53                 stack2.push(num)
54             }
55         }
56         
57         return stack2.peek() ?? 0
58     }
59     
60     /** Returns whether the queue is empty. */
61     func empty() -> Bool {
62       return stack.isEmpty && stack2.isEmpty
63     }
64 }
65 
66 /**
67  * Your MyQueue object will be instantiated and called as such:
68  * let obj = MyQueue()
69  * obj.push(x)
70  * let ret_2: Int = obj.pop()
71  * let ret_3: Int = obj.peek()
72  * let ret_4: Bool = obj.empty()
73  */
74  

16ms

 1 class MyQueue {
 2 
 3     fileprivate var stack = [Int?]()
 4     fileprivate var reserveStack = [Int?]()
 5     
 6     
 7     /** Initialize your data structure here. */
 8     init() {
 9         stack = [Int]()
10         reserveStack = [Int]()
11     }
12     
13     /** Push element x to the back of queue. */
14     func push(_ x: Int) {
15         if reserveStack.isEmpty{
16             stack.append(x)
17         }else{
18             // 翻轉reserveStack
19             while !reserveStack.isEmpty {
20                 stack.append(reserveStack.popLast()!)
21             }
22             stack.append(x)
23         }
24         
25     }
26     
27     /** Removes the element from in front of queue and returns that element. */
28     func pop() -> Int {
29         
30         // 原棧為空,說明資料翻轉到reserve棧中
31         if stack.isEmpty{
32             return reserveStack.removeLast()!
33         }
34         
35         // 翻轉stack
36         while !stack.isEmpty {
37             reserveStack.append(stack.removeLast())
38         }
39         
40         return reserveStack.removeLast()!
41     }
42     
43     /** Get the front element. */
44     func peek() -> Int {
45        
46         // 原棧為空,說明資料翻轉到reserve棧中
47         if stack.isEmpty{
48             return reserveStack.last!!
49         }
50         
51         // 翻轉stack
52         while !stack.isEmpty {
53             reserveStack.append(stack.removeLast()!)
54         }
55         
56         return reserveStack.last!!
57     }
58     
59     /** Returns whether the queue is empty. */
60     func empty() -> Bool {
61         
62         if stack.isEmpty && reserveStack.isEmpty {
63             return true
64         }
65         
66         return false
67     }
68 }
69 
70 /**
71  * Your MyQueue object will be instantiated and called as such:
72  * let obj = MyQueue()
73  * obj.push(x)
74  * let ret_2: Int = obj.pop()
75  * let ret_3: Int = obj.peek()
76  * let ret_4: Bool = obj.empty()
77  */
78  

20ms

 1 class MyQueue {
 2 
 3    var queue : [Int]
 4     /** Initialize your data structure here. */
 5     init() {
 6         self.queue = [Int]()
 7     }
 8     
 9     /** Push element x to the back of queue. */
10     func push(_ x: Int) {
11         self.queue.insert(x, at: 0)
12     }
13     
14     /** Removes the element from in front of queue and returns that element. */
15     func pop() -> Int {
16         return self.queue.removeLast()
17     }
18     
19     /** Get the front element. */
20     func peek() -> Int {
21         return self.queue.last!
22     }
23     
24     /** Returns whether the queue is empty. */
25     func empty() -> Bool {
26         return self.queue.isEmpty
27     }
28 }
29 
30 /**
31  * Your MyQueue object will be instantiated and called as such:
32  * let obj = MyQueue()
33  * obj.push(x)
34  * let ret_2: Int = obj.pop()
35  * let ret_3: Int = obj.peek()
36  * let ret_4: Bool = obj.empty()
37  */
38