File tree Expand file tree Collapse file tree 1 file changed +75
-0
lines changed Expand file tree Collapse file tree 1 file changed +75
-0
lines changed Original file line number Diff line number Diff line change
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
+ };
You can’t perform that action at this time.
0 commit comments