题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
解题思路:
该题注意利用举例的方法使抽象的问题具体化;题目中是可以在O(1)复杂度的情况下,获取栈中所有元素的最小元素,所以不能对栈中的数据进行排序操作,而且排序操作破坏了栈先进后出,后进先出的特点;综上考虑得开辟辅助空间。如果辅助空间仅保存当前栈中最小元素,那么在数据栈进行弹栈操作后,不知道该元素是否是最小元素;所以得记录压入数据栈中每个栈长度对应的最小值,辅助栈与数据栈一样长,辅助栈的第i个元素表示数据栈中第i个元素到栈底元素之间所有元素的最小元素。辅助栈的实现只需要在每次对数据栈进行push时,比较当前push的元素与辅助栈的栈顶元素的大小,在辅助栈中压入较小的元素。
数据栈用m_data表示,辅助栈用m_min表示;assert表示不满足其括号中的条件的时候中断运行程序。
实现代码:
#include <assert.h>
class Solution {
public:
stack<int> m_data,m_min;//m_data数据栈,m_min最小辅助栈
void push(int value) {
m_data.push(value);
if(m_min.size() == 0 || m_min.top() > value)
m_min.push(value);
else
m_min.push(m_min.top());
}
void pop() {
assert(m_data.size() > 0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
int top() {
assert(m_data.size() > 0);
return m_data.top();
}
int min() {
assert(m_data.size() > 0 && m_min.size() > 0);
return m_min.top();
}
};