【25】实现一个含有min函数的栈的通用模板

简介: 题目:设计一个栈类型,使得在该栈类型中有一个函数min可以得到栈的最小元素,要求这个栈的push、pop、min都是O(1)。分析:1. 栈的性质是先进后出,因此一般情况下栈的push、pop的时间是O(1),但是要求栈的min必须要枚举整个栈,时间复杂度为O(n)2.


题目:设计一个栈类型,使得在该栈类型中有一个函数min可以得到栈的最小元素,要求这个栈的push、pop、min都是O(1)。

分析:

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


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天前
|
缓存 算法 C语言
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
数据结构与算法⑧(第三章_上)栈的概念和实现(力扣:20. 有效的括号)
4 0
|
1天前
数据结构——栈
数据结构——栈
10 1
|
5天前
|
前端开发 JavaScript 算法
JavaScript 中实现常见数据结构:栈、队列与树
JavaScript 中实现常见数据结构:栈、队列与树
|
6天前
|
存储 NoSQL C语言
数据结构——顺序栈与链式栈的实现-2
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-2
|
6天前
|
存储 C语言
数据结构——顺序栈与链式栈的实现-1
数据结构——顺序栈与链式栈的实现
数据结构——顺序栈与链式栈的实现-1
|
6天前
|
机器学习/深度学习 算法 测试技术
【单调栈】3113. 边界元素是最大值的子数组数目
【单调栈】3113. 边界元素是最大值的子数组数目
|
6天前
栈的基本应用
栈的基本应用
14 3
|
6天前
栈与队列理解
栈与队列理解
13 1
|
6天前
|
存储 算法
数据结构与算法 栈与队列
数据结构与算法 栈与队列
12 0
数据结构与算法 栈与队列
|
6天前
|
C++
数据结构(共享栈
数据结构(共享栈
9 0