[LeetCode] 225. Implement Stack using Queues 用队列来实现栈
Implement the following operations of a stack using queues.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- empty() -- Return whether the stack is empty.
Notes:
- You may assume that all operations are valid (for example, no pop or top operations will be called on an empty stack).
- Depending on your language, queue may not be supported natively. You may simulate a queue by using a list or deque (double-ended queue), as long as you use only standard operations of a queue -- which means only
push to back
,pop from front
,size
, andis empty
operations are valid.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and all test cases.
用队列Queues的基本操作来实现栈Stack,队列和栈都是重要的数据结构,区别主要是,队列是先进先出,而栈是先进后出。
解法1: 在队列push进来新元素时,就把其它元素pop出来排到新元素的后面,新元素就在前面了,就可以后进先出。就好像大家都在排队,来了个重要客人,要让他第一,其他人从前面按顺序跑到他后面。
解法2: push的时候,其他元素不动只是用一个变量记住这个新元素。当top的时候直接给这个变量的值。当pop时,在调整顺序,把最后一个排到前面,弹出。变量记住目前在最尾部的值。
Java:
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 | class MyStack { LinkedList<Integer> queue1 = new LinkedList<Integer>(); LinkedList<Integer> queue2 = new LinkedList<Integer>(); // Push element x onto stack. public void push( int x) { if (empty()){ queue1.offer(x); } else { if (queue1.size()> 0 ){ queue2.offer(x); int size = queue1.size(); while (size> 0 ){ queue2.offer(queue1.poll()); size--; } } else if (queue2.size()> 0 ){ queue1.offer(x); int size = queue2.size(); while (size> 0 ){ queue1.offer(queue2.poll()); size--; } } } } // Removes the element on top of the stack. public void pop() { if (queue1.size()> 0 ){ queue1.poll(); } else if (queue2.size()> 0 ){ queue2.poll(); } } // Get the top element. public int top() { if (queue1.size()> 0 ){ return queue1.peek(); } else if (queue2.size()> 0 ){ return queue2.peek(); } return 0 ; } // Return whether the stack is empty. public boolean empty() { return queue1.isEmpty() & queue2.isEmpty(); } } |
Python: Time: push: O(n), pop: O(1), top: O(1), Space: O(n)
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 | class Queue: def __init__( self ): self .data = collections.deque() def push( self , x): self .data.append(x) def peek( self ): return self .data[ 0 ] def pop( self ): return self .data.popleft() def size( self ): return len ( self .data) def empty( self ): return len ( self .data) = = 0 class Stack: # initialize your data structure here. def __init__( self ): self .q_ = Queue() # @param x, an integer # @return nothing def push( self , x): self .q_.push(x) for _ in xrange ( self .q_.size() - 1 ): self .q_.push( self .q_.pop()) # @return nothing def pop( self ): self .q_.pop() # @return an integer def top( self ): return self .q_.peek() # @return an boolean def empty( self ): return self .q_.empty() |
Python: Time: push: O(1), pop: O(n), top: O(1),Space: O(n)
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 | class Stack: # initialize your data structure here. def __init__( self ): self .q_ = Queue() self .top_ = None # @param x, an integer # @return nothing def push( self , x): self .q_.push(x) self .top_ = x # @return nothing def pop( self ): for _ in xrange ( self .q_.size() - 1 ): self .top_ = self .q_.pop() self .q_.push( self .top_) self .q_.pop() # @return an integer def top( self ): return self .top_ # @return an boolean def empty( self ): return self .q_.empty() |
类似题目:
[LeetCode] 232. Implement Queue using Stacks 用栈来实现队列
All LeetCode Questions List 题目汇总
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步