【25】实现一个含有min函数的栈的通用模板
2014-06-08 08:27
330 查看
题目:设计一个栈类型,使得在该栈类型中有一个函数min可以得到栈的最小元素,要求这个栈的push、pop、min都是O(1)。
分析:
1. 栈的性质是先进后出,因此一般情况下栈的push、pop的时间是O(1),但是要求栈的min必须要枚举整个栈,时间复杂度为O(n)
2. 题目要求设计一个栈在O(1)的时间内找到min,我们要想到一个方法来满足,先看一个例子
3. 从下面的表中我们可以很清楚的看到,我么需要维护一个保存min的栈,并且这个栈和我们的数据栈是一起变化的,因此我们可以利用两个栈来模拟实现这个过程
4. 示例代码
//实现含有min的栈类模板
template <typename T>
class Stack{
public:
Stack(void);
~Stack(void){}
//声明函数
void Push(const T& value);
void Pop(void);
T Min(void);
private:
stack<T> dataStk;
stack<T> minStk;
};
//实现构造函数
template <typename T> Stack<T>::Stack(void){
//清空两个栈
while(!dataStk.empty()){
dataStk.pop();
}
while(!minStk.empty()){
minStk.pop();
}
}
//实现Push
template <typename T> void Stack<T>::Push(const T& value){
dataStk.push(value);
//如果是空栈直接插入,不能通过取栈顶元素比较
if(minStk.empty()){
minStk.push(value);
}
else{
T minValue = minStk.top();
if(minValue > value){
minValue = value;
}
//插入到minStk中
minStk.push(minValue);
}
}
//实现Pop函数
template <typename T> void Stack<T>::Pop(void){
//如果是空栈报异常
if(dataStk.empty()){
throw exception("error");
}
else{
dataStk.pop();
minStk.pop(); //同时删除minStk栈顶元素
}
}
//实现Min函数
template <typename T> T Stack<T>::Min(void){
//如果空栈返回异常
if(minStk.empty()){
throw exception("error");
}
else{
return minStk.top();
}
}
分析:
1. 栈的性质是先进后出,因此一般情况下栈的push、pop的时间是O(1),但是要求栈的min必须要枚举整个栈,时间复杂度为O(n)
2. 题目要求设计一个栈在O(1)的时间内找到min,我们要想到一个方法来满足,先看一个例子
3. 从下面的表中我们可以很清楚的看到,我么需要维护一个保存min的栈,并且这个栈和我们的数据栈是一起变化的,因此我们可以利用两个栈来模拟实现这个过程
操作 | 栈的元素(左边栈顶) | 最小值 | |
第一次 | Push 5 | 5 | 5 |
第二次 | Push 6 | 6 5 | 5 |
第三次 | Push 4 | 4 6 5 | 4 |
第四次 | Push 7 | 7 4 6 5 | 4 |
第五次 | Push 9 | 9 7 4 6 5 | 4 |
第六次 | Pop | 7 4 6 5 | 4 |
第七次 | Pop | 4 6 5 | 4 |
第八次 | Pop | 6 5 | 5 |
第九次 | Pop | 5 | 5 |
//实现含有min的栈类模板
template <typename T>
class Stack{
public:
Stack(void);
~Stack(void){}
//声明函数
void Push(const T& value);
void Pop(void);
T Min(void);
private:
stack<T> dataStk;
stack<T> minStk;
};
//实现构造函数
template <typename T> Stack<T>::Stack(void){
//清空两个栈
while(!dataStk.empty()){
dataStk.pop();
}
while(!minStk.empty()){
minStk.pop();
}
}
//实现Push
template <typename T> void Stack<T>::Push(const T& value){
dataStk.push(value);
//如果是空栈直接插入,不能通过取栈顶元素比较
if(minStk.empty()){
minStk.push(value);
}
else{
T minValue = minStk.top();
if(minValue > value){
minValue = value;
}
//插入到minStk中
minStk.push(minValue);
}
}
//实现Pop函数
template <typename T> void Stack<T>::Pop(void){
//如果是空栈报异常
if(dataStk.empty()){
throw exception("error");
}
else{
dataStk.pop();
minStk.pop(); //同时删除minStk栈顶元素
}
}
//实现Min函数
template <typename T> T Stack<T>::Min(void){
//如果空栈返回异常
if(minStk.empty()){
throw exception("error");
}
else{
return minStk.top();
}
}
相关文章推荐
- POI实现一个通用的Excel读取模板
- C++模板来实现一个通用的内存池.
- 【C++】通过模板实现一个通用的冒泡排序
- js实现datagrid 模板列中有多个checkbox 时只许选中一个..........
- 一个不错的模板Heap实现及Heap排序的实现
- OpenCms JSP 模板开发——创建一个含有多个可编辑元素的JSP模板
- 采用C++的ACE库实现的一个通用的C/S架构通信程序(最终版)
- OpenCms JSP 模板开发——创建一个含有多个可编辑元素的JSP模板
- 一个简单的通用回调模板
- 设计、实现一个 Asp.Net 应用的通用数据存取层(二)
- 一个通用的DAO接口及其Hibernate3实现
- VS2005的一个小问题,我编写了一个min函数,使用模板,传递的参数没有智能提示
- ACE实现了一个通用的架构通信程序
- 一个函数返回两值的通用实现方法(简单,备忘)
- OpenCms JSP 模板开发——创建一个含有多个可编辑元素的JSP模板
- 写一个CopyOnWrite的通用实现(C++)
- 如何多次包含一个含有实现的头文件
- 一个用模板实现的计数基类
- 设计、实现一个 Asp.Net 应用的通用数据存取层
- 设计并实现用于ASP.NET一个通用的数据存取层应用程序 原作者 Paul Abarham 翻译 cwxiao888@163.com