zoukankan      html  css  js  c++  java
  • [Daily]设计一个获取最小值时间复杂度为O(1)的栈

    【题目】

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

    【要求】

    • 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; 
    }
    
    • 运行截图
  • 相关阅读:
    PHP:判断客户端是否使用代理服务器及其匿名级别
    Ruby:Mechanize的使用教程
    Ruby:多线程队列(Queue)下载博客文章到本地
    Ruby:线程实现经典的生产者消费者问题
    Ruby:Open-uri和Net::HTTP的不同
    Ruby:Nokogiri
    Ruby:字符串处理函数
    Ruby:Net::HTTP
    10分钟打造强大的gvim
    命令行批量合并视频脚本
  • 原文地址:https://www.cnblogs.com/ZhuSenlin/p/12381055.html
Copyright © 2011-2022 走看看