forked from azl397985856/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
luzhipeng
committed
Jun 19, 2019
1 parent
abd5320
commit f651ec4
Showing
8 changed files
with
145 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
<mxfile modified="2019-06-19T05:58:04.790Z" host="www.draw.io" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" etag="ehqGnSL90-hr5OlbFnbc" version="10.7.7" type="device"><diagram id="_fEM7Qsu0uZZbjk_TLyQ" name="第 1 页">5ZlLc5swEMc/DcfMIIlHfLQd9zXpoeNDztTIoIlABERs59N3McK2EJlx29hi4hPw1wv9VtoVi0Pm2fZrGRXpTxFT7mA33jrkwcEYYezBpVF2rRIgvxWSksWq0lFYsjeqRFepNYtppVWUQnDJCl1ciTynK6lpUVmKjV5tLbg+ahEl1BCWq4ib6hOLZdqq9zg86t8oS9JuZBRM2pIs6iqrmVRpFIvNiUQWDpmXQsj2LtvOKW/gdVzadl/eKT28WElzeU6D3du0xo9B+PgUv2RB/eN3RR/vVC+vEa/VhJW9KrnrEJSizmPa9OI6ZLZJmaTLIlo1pRswOmipzDg8IbhV/dFS0u27L4oO04d1Q0VGZbmDKqoBCUnbRC0ZHKolszkxgIKanrD3lBYpkyeHno9U4EaB+QtI2IBERgeJIMuQiAEJjw+SbxmSZ0BC44M0sQwJmfvNPiXs9pxS4FqmNMYN16dEXNuUzB1n33cblDzblHyDkv1jgEHp3jalwKBUyWj1bJCCOUsdRyVL8UzngosSlFzkUHO2Zpz3pIizJIfHFTCioM8aggxOo1NVkLE4boYZ5K9b6CNM0PHtnN7AdvYGTIAvZoLQMEFKebH83GbwEBmZGe5vbScE+kbwBjz2dS0wucWNcAjeYzFD1/GJGazHTc/V1yo5L2yi4GKQzCTDCCDpHjW0Dsn86HFwwJt9G7NXDVbwUjc5o9la5PKu2mfMplABpr/dw+nK4S5R130/VRHl/9eRP8MEOz40db9nBadZQxu7v2oK74zdumJ5Ate9F6q6YQFHO7L+NiDvJ9apo/RZDZmuewe+lBfTYNHpKleJP8i3oVBfkj4a8G3XdW7mYeuTR3ky6YV533Z8MQ9aNxDmfX9kYZ6YYX4E38fBP8X5yyWAzTA/glRLD9KZcf5ykMwwb/8w1IeEBkLPdSmZuc0RZID7lAaCw3UpmblN3zol4+cdsf1fysxtWofkE30pXfLzAx6P/5j3ZSd/6sniDw==</diagram></mxfile> |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
## 题目地址 | ||
|
||
https://leetcode.com/problems/implement-queue-using-stacks/description/ | ||
|
||
## 题目描述 | ||
|
||
``` | ||
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 top, peek/pop from top, size, 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). | ||
``` | ||
|
||
## 思路 | ||
|
||
这道题目是让我们用栈来模拟实现队列。 我们直到栈和队列都是一种受限的数据结构。 | ||
栈的特点是只能在一端进行所有操作,队列的特点是只能在一端入队,另一端出队。 | ||
|
||
在这里我们可以借助另外一个栈,也就是说用两个栈来实现队列的效果。这种做法的时间复杂度和空间复杂度都是O(n)。 | ||
|
||
由于栈只能操作一端,因此我们peek或者pop的时候也只去操作顶部元素,要达到目的 | ||
我们需要在push的时候将队头的元素放到栈顶即可。 | ||
|
||
因此我们只需要在push的时候,用一下辅助栈即可。 | ||
具体做法是先将栈清空并依次放到另一个辅助栈中,辅助栈中的元素再次放回栈中,最后将新的元素push进去即可。 | ||
|
||
比如我们现在栈中已经是1,2,3,4了。 我们现在要push一个5. | ||
|
||
push之前是这样的: | ||
|
||
![232.implement-queue-using-stacks.drawio](../assets/problems/232.implement-queue-using-stacks-1.jpg) | ||
|
||
然后我们将栈中的元素转移到辅助栈: | ||
|
||
![232.implement-queue-using-stacks.drawio](../assets/problems/232.implement-queue-using-stacks-2.jpg) | ||
|
||
最后将新的元素添加到栈顶。 | ||
|
||
![232.implement-queue-using-stacks.drawio](../assets/problems/232.implement-queue-using-stacks-3.jpg) | ||
|
||
|
||
整个过程是这样的: | ||
|
||
![232.implement-queue-using-stacks.drawio](../assets/problems/232.implement-queue-using-stacks-4.jpg) | ||
## 关键点解析 | ||
|
||
- 在push的时候利用辅助栈(双栈) | ||
|
||
## 代码 | ||
|
||
```js | ||
|
||
|
||
/* | ||
* @lc app=leetcode id=232 lang=javascript | ||
* | ||
* [232] Implement Queue using Stacks | ||
*/ | ||
/** | ||
* Initialize your data structure here. | ||
*/ | ||
var MyQueue = function() { | ||
// tag: queue stack array | ||
this.stack = []; | ||
this.helperStack = []; | ||
}; | ||
|
||
/** | ||
* Push element x to the back of queue. | ||
* @param {number} x | ||
* @return {void} | ||
*/ | ||
MyQueue.prototype.push = function(x) { | ||
let cur = null; | ||
while ((cur = this.stack.pop())) { | ||
this.helperStack.push(cur); | ||
} | ||
this.helperStack.push(x); | ||
|
||
while ((cur = this.helperStack.pop())) { | ||
this.stack.push(cur); | ||
} | ||
}; | ||
|
||
/** | ||
* Removes the element from in front of queue and returns that element. | ||
* @return {number} | ||
*/ | ||
MyQueue.prototype.pop = function() { | ||
return this.stack.pop(); | ||
}; | ||
|
||
/** | ||
* Get the front element. | ||
* @return {number} | ||
*/ | ||
MyQueue.prototype.peek = function() { | ||
return this.stack[this.stack.length - 1]; | ||
}; | ||
|
||
/** | ||
* Returns whether the queue is empty. | ||
* @return {boolean} | ||
*/ | ||
MyQueue.prototype.empty = function() { | ||
return this.stack.length === 0; | ||
}; | ||
|
||
/** | ||
* Your MyQueue object will be instantiated and called as such: | ||
* var obj = new MyQueue() | ||
* obj.push(x) | ||
* var param_2 = obj.pop() | ||
* var param_3 = obj.peek() | ||
* var param_4 = obj.empty() | ||
*/ | ||
``` | ||
|
||
## 扩展 | ||
- 类似的题目有用队列实现栈,思路是完全一样的,大家有兴趣可以试一下。 | ||
- 栈混洗也是借助另外一个栈来完成的,从这点来看,两者有相似之处。 | ||
|