@@ -46,12 +46,10 @@ template <typename T> class StackWithMin {
4646 if (empty ()) {
4747 data.push (value);
4848 _min = value;
49- }
50- else if (value < *_min) {
49+ } else if (value < *_min) {
5150 data.push (2 * value - *_min);
5251 _min = value;
53- }
54- else {
52+ } else {
5553 data.push (value);
5654 }
5755 }
@@ -78,17 +76,11 @@ template <typename T> class StackWithMin {
7876 return (front < *_min) ? _min : front;
7977 }
8078
81- std::optional<T> min () {
82- return _min;
83- }
79+ std::optional<T> min () { return _min; }
8480
85- bool empty () {
86- return data.empty ();
87- }
81+ bool empty () { return data.empty (); }
8882
89- size_t size () {
90- return data.size ();
91- }
83+ size_t size () { return data.size (); }
9284
9385private:
9486 std::stack<T> data;
@@ -140,8 +132,10 @@ void test() {
140132
141133 // If pop() is supposed to be safe on empty, this should not crash.
142134 stack.pop ();
143- runner.expectEqual (stack.min (), std::optional<int >{}, " min still empty after pop on empty" );
144- runner.expectEqual (stack.top (), std::optional<int >{}, " top still empty after pop on empty" );
135+ runner.expectEqual (stack.min (), std::optional<int >{},
136+ " min still empty after pop on empty" );
137+ runner.expectEqual (stack.top (), std::optional<int >{},
138+ " top still empty after pop on empty" );
145139 }
146140
147141 // 2) Basic push/pop + popping all the way to empty
@@ -158,12 +152,16 @@ void test() {
158152 runner.expectEqual (stack.top (), std::optional<int >(5 ), " top after pop" );
159153
160154 stack.pop (); // removes 5
161- runner.expectEqual (stack.min (), std::optional<int >(10 ), " min after pop to single" );
162- runner.expectEqual (stack.top (), std::optional<int >(10 ), " top after pop to single" );
155+ runner.expectEqual (stack.min (), std::optional<int >(10 ),
156+ " min after pop to single" );
157+ runner.expectEqual (stack.top (), std::optional<int >(10 ),
158+ " top after pop to single" );
163159
164160 stack.pop (); // removes 10 -> empty
165- runner.expectEqual (stack.min (), std::optional<int >{}, " min after popping to empty" );
166- runner.expectEqual (stack.top (), std::optional<int >{}, " top after popping to empty" );
161+ runner.expectEqual (stack.min (), std::optional<int >{},
162+ " min after popping to empty" );
163+ runner.expectEqual (stack.top (), std::optional<int >{},
164+ " top after popping to empty" );
167165 }
168166
169167 // 3) Negative values + restore
@@ -172,7 +170,8 @@ void test() {
172170 stack.push (-1 );
173171 stack.push (7 );
174172 stack.push (-2 );
175- runner.expectEqual (stack.min (), std::optional<int >(-2 ), " min with negative" );
173+ runner.expectEqual (stack.min (), std::optional<int >(-2 ),
174+ " min with negative" );
176175
177176 stack.pop ();
178177 runner.expectEqual (stack.min (), std::optional<int >(-1 ), " min restored" );
@@ -187,20 +186,28 @@ void test() {
187186 stack.push (1 );
188187 stack.push (2 );
189188
190- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min with duplicates" );
191- runner.expectEqual (stack.top (), std::optional<int >(2 ), " top with duplicates" );
189+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
190+ " min with duplicates" );
191+ runner.expectEqual (stack.top (), std::optional<int >(2 ),
192+ " top with duplicates" );
192193
193194 stack.pop (); // pop 2
194- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min after popping non-min" );
195- runner.expectEqual (stack.top (), std::optional<int >(1 ), " top after popping non-min" );
195+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
196+ " min after popping non-min" );
197+ runner.expectEqual (stack.top (), std::optional<int >(1 ),
198+ " top after popping non-min" );
196199
197200 stack.pop (); // pop 1 (still another 1 remains)
198- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min remains after popping one duplicate min" );
199- runner.expectEqual (stack.top (), std::optional<int >(1 ), " top now duplicate min" );
201+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
202+ " min remains after popping one duplicate min" );
203+ runner.expectEqual (stack.top (), std::optional<int >(1 ),
204+ " top now duplicate min" );
200205
201206 stack.pop (); // pop last 1, min should restore to 3
202- runner.expectEqual (stack.min (), std::optional<int >(3 ), " min restores after all duplicate mins removed" );
203- runner.expectEqual (stack.top (), std::optional<int >(3 ), " top restores after all duplicate mins removed" );
207+ runner.expectEqual (stack.min (), std::optional<int >(3 ),
208+ " min restores after all duplicate mins removed" );
209+ runner.expectEqual (stack.top (), std::optional<int >(3 ),
210+ " top restores after all duplicate mins removed" );
204211 }
205212
206213 // 5) All equal values
@@ -210,15 +217,20 @@ void test() {
210217 stack.push (4 );
211218 stack.push (4 );
212219
213- runner.expectEqual (stack.min (), std::optional<int >(4 ), " min with all equal" );
214- runner.expectEqual (stack.top (), std::optional<int >(4 ), " top with all equal" );
220+ runner.expectEqual (stack.min (), std::optional<int >(4 ),
221+ " min with all equal" );
222+ runner.expectEqual (stack.top (), std::optional<int >(4 ),
223+ " top with all equal" );
215224
216225 stack.pop ();
217- runner.expectEqual (stack.min (), std::optional<int >(4 ), " min after pop with all equal" );
226+ runner.expectEqual (stack.min (), std::optional<int >(4 ),
227+ " min after pop with all equal" );
218228 stack.pop ();
219- runner.expectEqual (stack.min (), std::optional<int >(4 ), " min after second pop with all equal" );
229+ runner.expectEqual (stack.min (), std::optional<int >(4 ),
230+ " min after second pop with all equal" );
220231 stack.pop ();
221- runner.expectEqual (stack.min (), std::optional<int >{}, " min after popping all equal to empty" );
232+ runner.expectEqual (stack.min (), std::optional<int >{},
233+ " min after popping all equal to empty" );
222234 }
223235
224236 // 6) Monotonic increasing: min should stay first element until empty
@@ -229,34 +241,44 @@ void test() {
229241 stack.push (3 );
230242 stack.push (4 );
231243
232- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min in increasing sequence" );
244+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
245+ " min in increasing sequence" );
233246 stack.pop (); // 4
234- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min after pop in increasing sequence" );
247+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
248+ " min after pop in increasing sequence" );
235249 stack.pop (); // 3
236- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min after second pop in increasing sequence" );
250+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
251+ " min after second pop in increasing sequence" );
237252 }
238253
239254 // 7) Monotonic decreasing: min updates each push, restores each pop
240255 {
241256 StackWithMin<int > stack;
242257 stack.push (4 );
243- runner.expectEqual (stack.min (), std::optional<int >(4 ), " min after push 4 (decreasing)" );
258+ runner.expectEqual (stack.min (), std::optional<int >(4 ),
259+ " min after push 4 (decreasing)" );
244260
245261 stack.push (3 );
246- runner.expectEqual (stack.min (), std::optional<int >(3 ), " min after push 3 (decreasing)" );
262+ runner.expectEqual (stack.min (), std::optional<int >(3 ),
263+ " min after push 3 (decreasing)" );
247264
248265 stack.push (2 );
249- runner.expectEqual (stack.min (), std::optional<int >(2 ), " min after push 2 (decreasing)" );
266+ runner.expectEqual (stack.min (), std::optional<int >(2 ),
267+ " min after push 2 (decreasing)" );
250268
251269 stack.push (1 );
252- runner.expectEqual (stack.min (), std::optional<int >(1 ), " min after push 1 (decreasing)" );
270+ runner.expectEqual (stack.min (), std::optional<int >(1 ),
271+ " min after push 1 (decreasing)" );
253272
254273 stack.pop (); // 1
255- runner.expectEqual (stack.min (), std::optional<int >(2 ), " min restores to 2 after popping 1" );
274+ runner.expectEqual (stack.min (), std::optional<int >(2 ),
275+ " min restores to 2 after popping 1" );
256276 stack.pop (); // 2
257- runner.expectEqual (stack.min (), std::optional<int >(3 ), " min restores to 3 after popping 2" );
277+ runner.expectEqual (stack.min (), std::optional<int >(3 ),
278+ " min restores to 3 after popping 2" );
258279 stack.pop (); // 3
259- runner.expectEqual (stack.min (), std::optional<int >(4 ), " min restores to 4 after popping 3" );
280+ runner.expectEqual (stack.min (), std::optional<int >(4 ),
281+ " min restores to 4 after popping 3" );
260282 }
261283
262284 // 8) Longer deterministic sequence: validate min after every push and pop
@@ -269,40 +291,48 @@ void test() {
269291 for (int i = 50 ; i >= 26 ; --i) {
270292 stack.push (i);
271293 expectedMin = std::min (expectedMin, i);
272- runner.expectEqual (stack.min (), std::optional<int >(expectedMin), " min after push in long sequence (part 1)" );
294+ runner.expectEqual (stack.min (), std::optional<int >(expectedMin),
295+ " min after push in long sequence (part 1)" );
273296 }
274297
275298 stack.push (0 );
276299 expectedMin = 0 ;
277- runner.expectEqual (stack.min (), std::optional<int >(0 ), " min after pushing 0 in long sequence" );
300+ runner.expectEqual (stack.min (), std::optional<int >(0 ),
301+ " min after pushing 0 in long sequence" );
278302
279303 for (int i = 25 ; i >= 1 ; --i) {
280304 stack.push (i);
281- runner.expectEqual (stack.min (), std::optional<int >(0 ), " min stays 0 in long sequence (part 2)" );
305+ runner.expectEqual (stack.min (), std::optional<int >(0 ),
306+ " min stays 0 in long sequence (part 2)" );
282307 }
283308
284309 // Now pop everything above 0; min should stay 0 until 0 is popped.
285310 for (int i = 1 ; i <= 25 ; ++i) {
286311 stack.pop ();
287- runner.expectEqual (stack.min (), std::optional<int >(0 ), " min stays 0 while popping down to 0" );
312+ runner.expectEqual (stack.min (), std::optional<int >(0 ),
313+ " min stays 0 while popping down to 0" );
288314 }
289315
290316 // Pop 0; min should restore to 26 (the smallest remaining from 26..50)
291317 stack.pop ();
292- runner.expectEqual (stack.min (), std::optional<int >(26 ), " min restores after popping 0" );
318+ runner.expectEqual (stack.min (), std::optional<int >(26 ),
319+ " min restores after popping 0" );
293320
294321 // Pop remaining; min should climb upward as we remove 26,27,...
295322 for (int expected = 27 ; expected <= 50 ; ++expected) {
296323 stack.pop ();
297324 runner.expectEqual (stack.min (),
298- (expected <= 50 ? std::optional<int >(expected) : std::optional<int >{}),
325+ (expected <= 50 ? std::optional<int >(expected)
326+ : std::optional<int >{}),
299327 " min after popping in long sequence tail" );
300328 }
301329 stack.pop ();
302330
303331 // After all popped, empty
304- runner.expectEqual (stack.min (), std::optional<int >{}, " min empty at end of long sequence" );
305- runner.expectEqual (stack.top (), std::optional<int >{}, " top empty at end of long sequence" );
332+ runner.expectEqual (stack.min (), std::optional<int >{},
333+ " min empty at end of long sequence" );
334+ runner.expectEqual (stack.top (), std::optional<int >{},
335+ " top empty at end of long sequence" );
306336 }
307337
308338 runner.summary ();
0 commit comments