• 实现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();
    }





  • 相关阅读:
    美国州名来源
    SQL Constraint/Index
    英语中的 姓氏/Surname
    GNU glibc
    英语人名探源/字母升序排列
    About 'atoi'
    封装一个类似jquery的ajax方法
    函数柯里化
    AngularJS实现TodoMVC
    webpack简单使用
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5303437.html
Copyright © 2020-2023  润新知