满足min.push.pop操作时间复杂度为o(1)的栈

本文介绍了一种设计方法,能够使栈的min、push和pop操作的时间复杂度达到O(1),并通过实例展示了其实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
设计一个栈结构,满足一下条件:min,push,pop操作的时间复杂度为O(1)。
*/
#include <limits>
#include <exception>
#include <iostream>

class stack
{
public:
	stack(int max_size)
	{
		this->max_size=max_size;
		this->cur_size=0;
		this->cur_min=std::numeric_limits<int>::max();
		this->cur_min_pos=-1;

		this->arr=new int[max_size];
		this->pos_arr=new int[max_size];
	}
	~stack()
	{
		delete[] arr;
		delete[] pos_arr;
	}
	int min()
	{
		return this->cur_min;
	}
	void push(int val)
	{
		if(this->cur_size==this->max_size)
			return ;
		else
		{
			if(val<this->cur_min)
			{
				this->cur_min=val;
				this->pos_arr[this->cur_size]=this->cur_min_pos;
				this->cur_min_pos=this->cur_size;
			}
			this->arr[this->cur_size++]=val;
		}
	}
	int pop()
	{
		if(this->cur_size==0)
			throw std::exception("stack has been empty");
		else
		{
			if(this->cur_min_pos==--this->cur_size)
			{
				this->cur_min_pos=this->pos_arr[this->cur_size];
				this->cur_min=this->arr[this->cur_min_pos];
			}
			return this->arr[this->cur_size];
		}
	}
private:
	//currrent min
	int cur_min;
	//cur_min pos
	int cur_min_pos;
	//value array
	int* arr;
	//pos array
	int* pos_arr;
	//max size
	int max_size;
	//current size
	int cur_size;
};

int main(int argc,char* argv[])
{
	try
	{
		stack t(10);
		t.push(23);
		t.push(2);
		t.push(32);
		t.push(1);
		std::cout<<t.min()<<std::endl;
		///
		t.pop();
		std::cout<<t.min()<<std::endl;
	}catch(std::exception& e)
	{
		std::cout<<"stack is empty!"<<std::endl;
	}
	system("PAUSE");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值