设计一个获取最小值时间复杂度为O的栈

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计一个获取最小值时间复杂度为O的栈相关的知识,希望对你有一定的参考价值。

【题目】

  • 实现一个栈,在实现栈的基本功能的前提下,再实现返回最小元素的操作。

【要求】

  • pop、push、getMin操作的时间复杂度都是O(1)
  • 设计的类可以使用现成的栈结构。

【分析】

  • 想要使得获取最小值的时间复杂度为O(1),最简单的方法就是提前将最小值记录下来,当我们需要获取时便可直接获取
  • 栈的特点就是先进后出。它的操作具有一定规律,这使得我们可以很好的记录最小值。
  • 很容易就能够想到“双栈”来实现

【实现】

  • 实现语言:C++
  • 源代码如下:
#include<iostream>
#include<stack> 
using namespace std;

#define Error -1

// 一个有获取最小值功能的特殊栈,获取最小值的时间复杂度为O(1) 
class GetMinStack
{
	private:
	stack<int> m_BasicStack;                 //主栈
	stack<int> m_MinNumStack;                //最小值栈
	

	public:	
	void push(int value)                     //入栈
	{
		if(m_BasicStack.empty())            //如果栈中无数据
			m_MinNumStack.push(value);        
		else if(value<=m_MinNumStack.top())  //如果入栈的值比当前的最小值还要小
		    m_MinNumStack.push(value);
		
		m_BasicStack.push(value); 
	} 
	
	int pop()
	{
		if(m_MinNumStack.empty())
		{
			//不可出栈
			cout<<"您操作的栈为空"<<endl;
			return Error; 
		}
		
		int temp=m_BasicStack.top();
		m_BasicStack.pop();
		if(temp==m_MinNumStack.top())
		    m_MinNumStack.pop();
		
		return temp;  
	}
	
	int getMin()
	{
		if(m_MinNumStack.empty())
		{
			//不可出栈
			cout<<"您操作的栈为空"<<endl;
			return Error;  
		}
		return m_MinNumStack.top();
	}
};

int main()
{
	GetMinStack test;
	test.push(5);
	test.push(8);
	test.push(4);
	test.push(10);
	
	cout<<"该栈最小的数为:"<<test.getMin()<<endl; 
}
  • 运行截图

以上是关于设计一个获取最小值时间复杂度为O的栈的主要内容,如果未能解决你的问题,请参考以下文章

设计一个有getMin功能的栈

左神算法之获取栈中最小值

(程序员面试题精选(02))-设计包含min函数的栈

算法题1-设计一个有getMin功能的栈

左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

设计一个有getMin功能的栈