去年10月份左右的时候,一位师兄曾说到他的一篇面试题,好像是实现一个队列,这个队列包含插入,弹出,找到最大值和最小值的操作。
对于实现一个栈,这个栈包含插入,弹出,找到最大值和最小值的操作,这个栈的实现相对于上面队列的实现更简单。
先说栈的实现:
使用三个栈来保存原栈,栈最大值和栈最小值。
stack<int> st;
stack<int> maxst;
stack<int> minst;
void push(int val)
{
st.push(val);
// 计算栈底到栈顶的最大值
if (maxst.empty() || maxst.top() <= val)
maxst.push(val);
//计算栈底到栈顶的最小值
if (minst.empty() || min.stop() >= val)
maxst.push(val);
}
void pop()
{
int value = st.top();
st.pop();
if (maxst.top() == value)
maxst.pop();
if (minst.top() == value)
minst.pop();
}
int findmin()
{
return minst.top();
}
int findmax()
{
return maxst.top();
}
从上面的代码中可以看到只需要三个栈,一个是栈本身元素,一个栈栈顶保存是栈的最大值,原栈进元素时,检查是否会改变当前栈最大值的值,如改变,