要求:容器既能满足栈的基本操作,又能获得最小值。
思路:使用两个栈容器来实现。一个栈用于正常栈操作,另外一个栈容器用于获得最小值。实现时,最主要的是元素的入栈操作。具体步骤参考如下代码注释。
#include <iostream>
#include <stack>
using namespace std;
template<class T>
class MyStack
{
public:
void pop()
{
m_stack.pop();
m_min_stack.pop();
}
void push(const T &val)
{
m_stack.push(val);
// 如果 m_min_stack 为空,则 val 即为当前最小元素
// 如果 m_min_stack 不为空,则需要比较 val 与栈顶元素谁更小
// 如果 val 更小,则将其压栈
if (m_min_stack.empty() || val < m_min_stack.top())
{
m_min_stack.push(val);
return;
}
// 如果栈顶元素更小,则将栈顶元素重复压栈
m_min_stack.push(m_min_stack.top());
}
T top()
{
return m_stack.top();
}
T min()
{
return m_min_stack.top();
}
size_t size()
{
return m_stack.size();
}
bool empty()
{
return m_stack.empty();
}
private:
stack<T> m_stack;
stack<T> m_min_stack;
};
void test()
{
MyStack<int> stack;
stack.push(5);
stack.push(8);
stack.push(2);
stack.push(1);
stack.push(4);
while (!stack.empty())
{
cout << stack.top() << " " << stack.min() << endl;
stack.pop();
}
}
int main()
{
test();
return 0;
}
程序输出结果:
4 1 1 1 2 2 8 5 5 5

冀公网安备13050302001966号