-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path232.implement-queue-using-stacks.ts
119 lines (113 loc) · 3.2 KB
/
232.implement-queue-using-stacks.ts
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*
* @lc app=leetcode id=232 lang=typescript
*
* [232] Implement Queue using Stacks
*
* https://leetcode.com/problems/implement-queue-using-stacks/description/
*
* algorithms
* Easy (59.33%)
* Likes: 3745
* Dislikes: 245
* Total Accepted: 445.5K
* Total Submissions: 750.3K
* Testcase Example: '["MyQueue","push","push","peek","pop","empty"]\n[[],[1],[2],[],[],[]]'
*
* 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() Returns true if the queue is empty, false otherwise.
*
*
* 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, 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 100 calls will be made to push, pop, peek, and empty.
* All the calls to pop and peek are 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.
*
*/
// @lc code=start
class MyQueue {
stack1: number[] = [];
stack2: number[] = [];
ready: boolean = false;
constructor() {}
push(x: number): void {
if (this.ready) {
while (this.stack2.length > 0) this.stack1.push(this.stack2.pop()!);
this.ready = false;
}
this.stack1.push(x);
}
pop(): number {
if (this.ready) return this.stack2.pop()!;
else if (this.stack1.length === 1) return this.stack1.pop()!;
while (this.stack1.length > 0) this.stack2.push(this.stack1.pop()!);
this.ready = true;
return this.stack2.pop()!;
}
peek(): number {
if (this.ready) return this.stack2[this.stack2.length - 1];
else if (this.stack1.length === 1) return this.stack1[0];
while (this.stack1.length > 0) this.stack2.push(this.stack1.pop()!);
this.ready = true;
return this.stack2[this.stack2.length - 1];
}
empty(): boolean {
return this.stack1.length === 0 && this.stack2.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()
*/
// @lc code=end