#pragma once
#ifndef MAX_STACK_H
#define MAX_STACK_H
#include <stdexcept>
template<typename T>
class MaxStack {
public:
MaxStack()
:
top_node{nullptr},
maximum{nullptr}
{}
void push(T datum)
{
MaxStackNode* new_node = new MaxStackNode(datum, top_node);
if (top_node == nullptr)
{
maximum = new_node;
}
else if (maximum->datum < datum)
{
new_node->previousMaximum = maximum;
maximum = new_node;
}
top_node = new_node;
}
void pop()
{
check_not_empty();
MaxStackNode* ret = top_node;
if (maximum == ret)
{
maximum = ret->previousMaximum;
}
top_node = top_node->previous;
delete ret;
}
T top()
{
check_not_empty();
return top_node->datum;
}
T max()
{
check_not_empty();
return maximum->datum;
}
private:
struct MaxStackNode {
T datum;
MaxStackNode* previous;
MaxStackNode* previousMaximum;
MaxStackNode(T datum, MaxStackNode* previous)
:
datum{datum},
previous{previous},
previousMaximum{nullptr}
{}
};
MaxStackNode* top_node;
MaxStackNode* maximum;
void check_not_empty()
{
if (top_node == nullptr)
{
throw std::runtime_error{"The stack is empty."};
}
}
};
#endif // MAX_STACK_H