5/30 每日一題(定義堆疊,使用兩個stack實現)
Implement a first in first out (FIFO) queue using only two stacks. The implemented queue should support all the functions of a normal queue (push, peek, pop, and empty).
Implement the MyQueue class:
void push(int x)Pushes element x to the back of the queue.int pop()Removes the element from the front of the queue and returns it.int peek()Returns the element at the front of the queue.boolean empty()Returnstrueif the queue is empty,falseotherwise.
Notes:
- You must use only standard operations of a stack, which means only
push to top,peek/pop from top,size, andis emptyoperations are valid. - Depending on your language, the stack may not be supported natively. You may simulate a stack using a list or deque (double-ended queue) as long as you use only a stack's standard operations.
Example 1:
Input ["MyQueue", "push", "push", "peek", "pop", "empty"] [[], [1], [2], [], [], []] Output [null, null, null, 1, 1, false] Explanation MyQueue myQueue = new MyQueue(); myQueue.push(1); // queue is: [1] myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue) myQueue.peek(); // return 1 myQueue.pop(); // return 1, queue is [2] myQueue.empty(); // return false
Constraints:
1 <= x <= 9- At most
100calls will be made topush,pop,peek, andempty. - All the calls to
popandpeekare valid.
Follow-up: Can you implement the queue such that each operation is amortized O(1) time complexity? In other words, performing n operations will take overall O(n) time even if one of those operations may take longer.
class MyQueue:
#要求使用2個stack模擬出先進先出(FIFO)
#第一個stack1紀錄元素的推入情況
#第二個stack2紀錄元素的彈出情況
#要push時使用stack1 ,當stack2不為空時彈出stack2元素
def __init__(self):
self.stack1=list()
self.stack2=list()
def push(self, x: int) -> None:
#stack1是用來記錄元素推入順序的堆疊
self.stack1.append(x)
def pop(self) -> int:
#stack1=[1,2] >>>stack2=[2,1] #彈出stack2即滿足FIFO
#將stack1的值彈入到stack2是為了確保彈出順序FIFO
if not self.stack2:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2.pop()
def peek(self) -> int:
#如果stack2存在,那最初進入的元素就是stack2的最後一項
if self.stack2:
return self.stack2[-1]
else:
while self.stack1:
self.stack2.append(self.stack1.pop())
return self.stack2[-1]
def empty(self) -> bool:
#當同時滿足 stack1 且 stack2 都為空時,就表示為他是empty
return len(self.stack1)==0 and len(self.stack2)==0
# Your MyQueue object will be instantiated and called as such:
# obj = MyQueue()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.peek()
# param_4 = obj.empty()
----------------------------------------參考解答
class MyQueue(object):
def __init__(self):
self.in_stk = []
self.out_stk = []
# Push element x to the back of queue...
def push(self, x):
self.in_stk.append(x)
# Remove the element from the front of the queue and returns it...
def pop(self):
self.peek()
return self.out_stk.pop()
# Get the front element...
def peek(self):
if not self.out_stk:
while self.in_stk:
self.out_stk.append(self.in_stk.pop())
return self.out_stk[-1]
# Return whether the queue is empty...
def empty(self):
return not self.in_stk and not self.out_stk標籤: leetcode

0 個意見:
張貼留言
訂閱 張貼留言 [Atom]
<< 首頁