zoukankan      html  css  js  c++  java
  • 实现O(1)时间复杂度带有min和max 函数的栈

    仅仅是演示实现。不考虑栈使用的数据结构是vector 还是其它容器。

    代码例如以下


    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    template <class T>
    class minMaxStack
    {
    public:
    	minMaxStack()
    	{
    		DataStack = new vector<T>;
    		minStack = new vector<int>;
    		maxStack = new vector<int>;
    	}
    	~minMaxStack()
    	{
    		delete DataStack;
    		delete minStack;
    		delete maxStack;
    	}
    	bool isEmpty()
    	{
    		return DataStack->size() == 0;
    	}
    	void push(T data)
    	{
    		
    		if (isEmpty())
    		{
    			DataStack->push_back(data);
    			minStack->push_back(0);
    			maxStack->push_back(0);
    		}
    		else
    		{
    			DataStack->push_back(data);
    			int minIndex = *(minStack->end()-1);
    			int maxIndex = *(maxStack->end()-1);
    			int min = *(DataStack->begin() + minIndex);
    			int max = *(DataStack->begin() + maxIndex);
    			if (min > data)
    			{
    				minStack->push_back(DataStack->size() - 1);
    			}
    			else
    			{
    				minStack->push_back(minIndex);
    			}
    			if (max > data)
    			{
    				maxStack->push_back(maxIndex);
    			}
    			else
    			{
    				maxStack->push_back(DataStack->size() - 1);
    			}
    		}
    	}
    
    	T getTop()
    	{
    		return *(DataStack->end()-1);
    	}
    	void pop()
    	{
    		if (isEmpty())
    		{
    			return;
    		}
    		minStack->erase(minStack->end()-1);
    		maxStack->erase(maxStack->end()-1);
    		DataStack->erase(DataStack->end()-1);
    	}
    	T max()
    	{
    		return *(DataStack->begin() + (*(maxStack->end()-1)));
    	}
    	T min()
    	{
    		return *(DataStack->begin() + (*(minStack->end()-1)));
    	}
    	void printStack()
    	{
    		cout << "栈顶:" << getTop() << endl;
    		cout << "最小:" << min() << endl;
    		cout << "最大:" << max() << endl;
    		cout << "
    
    ";
    	}
    private:
    	vector<T> * DataStack;
    	vector<int> * minStack;
    	vector<int> * maxStack;
    };
    
    
    
    void main()
    {
    	minMaxStack<int> st;
    	st.push(6);
    	st.printStack();
    	st.push(17);
    	st.printStack();
    	st.push(7);
    	st.printStack();
    	st.push(3);
    	st.printStack();
    	st.pop();
    	st.printStack();
    	st.pop();
    	st.printStack();
    	st.pop();
    	st.printStack();
    	cin.get();
    }





  • 相关阅读:
    BZOJ 4010: [HNOI2015]菜肴制作( 贪心 )
    bzoj 1084
    bzoj 2763
    bzoj 1003
    bzoj 1858
    codevs 1296
    cf 438D
    vijos 1083
    codevs 3303
    bzoj 1296
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5303437.html
Copyright © 2011-2022 走看看