#include <iostream>
#include <stack>
#include <climits>
class MinMaxStack {
private:
std::stack<int> mainStack;
std::stack<int> minStack;
std::stack<int> maxStack;
public:
void push(int element) {
[Link](element);
if ([Link]() || element <= [Link]()) {
[Link](element);
}
if ([Link]() || element >= [Link]()) {
[Link](element);
}
}
int pop() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
int topElement = [Link]();
[Link]();
if (topElement == [Link]()) {
[Link]();
}
if (topElement == [Link]()) {
[Link]();
}
return topElement;
}
int peek() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
return [Link]();
}
bool isEmpty() {
return [Link]();
}
int size() {
return [Link]();
}
int getMin() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
return [Link]();
}
int getMax() {
if (isEmpty()) {
throw std::runtime_error("Stack is empty");
}
return [Link]();
}
void clear() {
while (!isEmpty()) {
pop();
}
}
};
int main() {
MinMaxStack stack;
std::cout << "Pushing elements: 5, 3, 7, 1, 9" << std::endl;
[Link](5);
[Link](3);
[Link](7);
[Link](1);
[Link](9);
std::cout << "Stack size: " << [Link]() << std::endl;
std::cout << "Top element: " << [Link]() << std::endl;
std::cout << "Minimum element: " << [Link]() << std::endl;
std::cout << "Maximum element: " << [Link]() << std::endl;
std::cout << "\nPopping elements:" << std::endl;
while (![Link]()) {
std::cout << "Popped: " << [Link]() << std::endl;
if (![Link]()) {
std::cout << "New min: " << [Link]() << std::endl;
std::cout << "New max: " << [Link]() << std::endl;
}
}
std::cout << "\nTesting clear operation" << std::endl;
[Link](10);
[Link](20);
std::cout << "Size before clear: " << [Link]() << std::endl;
[Link]();
std::cout << "Size after clear: " << [Link]() << std::endl;
return 0;
}