实现push,pop,max为O(1)的栈

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值