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