Skip to content

Commit 1354548

Browse files
authored
Create design-front-middle-back-queue.cpp
1 parent 72d2278 commit 1354548

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// Time: O(1)
2+
// Space: O(n)
3+
4+
class FrontMiddleBackQueue {
5+
public:
6+
FrontMiddleBackQueue() {
7+
8+
}
9+
10+
void pushFront(int val) {
11+
left_.emplace_front(val);
12+
balance();
13+
}
14+
15+
void pushMiddle(int val) {
16+
if (size(left_) > size(right_)) {
17+
right_.emplace_front(left_.back());
18+
left_.pop_back();
19+
}
20+
left_.emplace_back(val);
21+
}
22+
23+
void pushBack(int val) {
24+
right_.emplace_back(val);
25+
balance();
26+
}
27+
28+
int popFront() {
29+
int result = -1;
30+
if (!empty(left_)) {
31+
result = left_.front();
32+
left_.pop_front();
33+
}
34+
balance();
35+
return result;
36+
}
37+
38+
int popMiddle() {
39+
int result = -1;
40+
if (!empty(left_)) {
41+
result = left_.back();
42+
left_.pop_back();
43+
}
44+
balance();
45+
return result;
46+
}
47+
48+
int popBack() {
49+
int result = -1;
50+
if (!empty(right_)) {
51+
result = right_.back();
52+
right_.pop_back();
53+
} else if (!empty(left_)) {
54+
result = left_.back();
55+
left_.pop_back();
56+
}
57+
balance();
58+
return result;
59+
}
60+
61+
private:
62+
void balance() {
63+
if (size(left_) > size(right_) + 1) {
64+
right_.emplace_front(left_.back());
65+
left_.pop_back();
66+
} else if (size(left_) < size(right_) ) {
67+
left_.emplace_back(right_.front());
68+
right_.pop_front();
69+
}
70+
}
71+
72+
// using list<int> is also fine but slower
73+
deque<int> left_;
74+
deque<int> right_;
75+
};

0 commit comments

Comments
 (0)