实现GetMin功能的栈

本文介绍了如何实现一个特殊栈,除了基本的push、pop操作外,还支持在常数时间内获取栈中的最小元素。通过维护两个栈,一个用于常规操作,另一个用于记录最小值,确保所有操作的时间复杂度均为O(1)。文中提供了两种不同的实现思路及相应的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】

     实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的栈。

【要求】

     1、pop、push、getMin操作的时间复杂度都为O(1)

     2、设计的站类型可以使用现成的栈结构

 

栈的一些基本定义模板:

 

//头文件
#include <stack>

//模板<类型名> 
template <typename T> 
struct specStack
{
	stack <T> s;
	stack <T> min;
	
	//empty函数定义必须要用const。empty函数将返回一个布尔值。
	bool empty() const
	{
	}
	
	//push函数 无返回值,用void定义,且有参数。
	void push(T param) 
	{
	}
	
	//pop函数。要先判空?非空才能进行pop
	void pop()
	{
	}
	
	//top函数。 要先判空?非空才能进行top
	T top()
	{
	}
	
	//size函数。有返回值,必须用int型。
	int size()
	{
	}
};
int main() 
{
	//<>里面可以改变类型 。定义一个名叫s的栈
	specStack <int> s;
} 

 

 

 

下面提供两种思路:

 

s栈:用来保存当前栈中的元素。具有正常栈的功能。

min栈 :用于保存每一步的最小值。

 

思路一:

压入数据规则:

(1)将当前数据压入s栈。

(2)然后判断min栈是否为空,若为空,也压入min栈。

(3)若不为空;

·判断当前数据即s栈顶元素的值与min栈顶元素得治的大小;

         如果s.top()<=min.top():则把当前数据(即s.top())也压入min栈

         如果s.top()>min.top():则把min栈顶元素重复压入min栈(即min.push(min.top())

弹出规则:

(1)s栈弹出栈顶元素

(2)min栈弹出栈顶元素

具体实现代码:

#include <iostream>
#include <stack>

using std::stack;
using std::cout;
using std::endl;

template <typename T>
struct specStack
{
	stack <T> s;
	stack <T> min;
	
	bool empty() const
	{
		return s.empty();
	}	
	void push(T param)
	{
		s.push(param);
		if(min.empty())
			min.push(param);
		else if(min.top()>s.top())
			min.push(s.top());	
		else
			min.push(min.top());
	}	
	void pop()
	{
		if(!empty())
		{
			s.pop();
			min.pop();
		}
	}	
	int size()
	{
		return s.size();
	}	
	T GetMin()
	{
		if(!empty()) 
			return min.top();
		else
			cout<<"ERROR:栈为空"<<endl; 
	}
	
	T top()
	{
		if(!empty())
			return s.top();
		else
			cout<<"ERROR:栈为空"<<endl; 
	}
};
int main()
{
	specStack <int> s;
	cout<<s.GetMin()<<endl;
	cout<<s.top()<<endl;
	s.push(4);
	s.push(5);
	cout<<s.GetMin()<<endl;
	s.push(4);
	cout<<s.GetMin()<<endl;
	s.push(3);
	s.push(2);
	s.push(1);
	cout<<s.GetMin()<<endl;
}

 

 

思路二:

压入数据规则:

(1)将当前数据压入s栈

(2)判断min栈是否为空

当min栈为空的时候,s栈的top值(即当前数据)压入min栈;

若min栈不为空,判断s栈栈顶元素与min栈栈顶元素的大小

如果s.top()<=min.top():则把当前数据(即s.top())压入min栈;

如果s.top()>min.top():则min栈不压入任何内容(与思路一的区别之处)

弹出数据规则:

(1)先判空?非空情况下进行如下操作

(2)先弹出s栈栈顶元素,设为value

(3)比较value与min栈栈顶元素大小(value的值值可能大于等于min栈栈顶元素)

当value=min.top();--------弹出min栈栈顶元素

当value>min.top();--------不弹出栈顶元素,返回value;

 

参考代码:

 

#include <iostream>
#include <stack>
using namespace std;

template <typename T>
struct specStack
{
	stack <T> s;
	stack <T> min;
	
	bool empty() const
	{
		return s.empty();
	}
	
	T top()
	{
		if(!empty())
			return s.top();
	}
	
	void push(T param) 
	{
		s.push(param);
		if(min.empty())
			min.push(param);
		else if(s.top()<=min.top())
				min.push(s.top());
	}
	
	void pop()
	{
		if(empty())
			cout<<"ERROR:栈为空"<<endl;
		else
		{
			if(s.top()==min.top())
				min.pop();
			s.pop();
		}
	}
	
	int size()
	{
		return s.size();
	}
	
	T GetMin()
	{
		if(!min.empty())
			return min.top();
		else
			cout<<"ERROR:栈为空"<<endl;
	}
};


int main()
{
	specStack <int> s;
	s.push(3);
	s.push(4);
	cout<<s.top()<<endl;
	cout<<s.GetMin()<<endl;
	s.push(5);
	s.push(1);
	s.push(2);
	s.push(1);
	cout<<s.GetMin()<<endl;
	cout<<s.min.size()<<endl;
	s.push(5);
	s.push(1);
	s.push(2);
	s.push(1);
	cout<<s.GetMin()<<endl;
}


题目来自于《程序员代码面试指南》。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值