实现push,pop,max为O(1)的栈
创建一个结构体,该结构体存储栈的元素以及该元素入栈时栈中的最大元素。
插入元素时,若该元素大于栈顶元素对应的结构体的最大元素,则push的结构体对应的数据为该元素,最大的元素也是该元素。
否则,结构体对应的data成员为该元素,max_elem成员为之前栈顶元素对应的max_elem。把该结构体变量入栈即可。
出栈时直接弹出栈顶的元素,无需任何修改,而求max元素时,取栈顶元素的max_elem成员即可。
也可以用两个栈来实现,因为入栈的元素的基本信息肯定要存储,如何达到max为O(1)呢,那么该元素入栈时候的max信息必须要保存。这样出栈的时候也不用多余操作。
一个栈s1存储元素信息,另外一个栈s2存储元素入栈时的当前栈的最大元素。每往栈中加一个元素elem,先向s1中push如该元素,然后向s2中push入当前的最大元素。
(若elem>s2栈顶元素),则s2应该push的是elem。否则s2中push的元素为原来s2栈顶的元素
#include<iostream> using namespace std; //max number of elements in stack const int max_num=1000; template<class T> struct Entry{ public: Entry(){} Entry(T d,T m):data(d),max_elem(m){} T data; T max_elem; }; template<class T> class Stack{ public: Stack(){ s=new Entry<T>[max_num](); count=0; } ~Stack(){ delete []s; } void push(T elem) { if(count==0||elem>this->top()){ Entry<T> temp(elem,elem); s[count++]=temp; } else{ Entry<T> temp(elem,top()); s[count++]=temp; } } void pop(){ if(count>0) count--; else cout<<"invalid,stack is already empty"<<endl; } T top(){ if(count>0) return s[count-1].data; else cout<<"invalid,stack is already empty"<<endl; return NULL; } T maxElem(){ if(count>0) return s[count-1].max_elem; else cout<<"invalid,stack is already empty"<<endl; return NULL; } Entry<T> topElem(){ if(count>0) return s[count-1]; else cout<<"invalid,stack is already empty"<<endl; return NULL; } int size(){ return count; } private: //s is used to store entry in stack Entry<T> *s; //current number of elements in stack int count; }; int main(){ Stack<int> s; s.push(5); cout<<s.top()<<endl; s.push(6); s.push(8); s.push(-4); s.push(1000); s.push(900); cout<<s.maxElem()<<endl; s.pop(); cout<<s.maxElem()<<endl; s.pop(); cout<<s.maxElem()<<endl; return 0; }