/**
设计一个栈结构,满足一下条件: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;
}
满足min.push.pop操作时间复杂度为o(1)的栈
最新推荐文章于 2021-05-27 09:26:54 发布