【题目】
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的栈。
【要求】
1、pop、push、getMin操作的时间复杂度都为O(1)
2、设计的站类型可以使用现成的栈结构
栈的一些基本定义模板:
//头文件
#include <stack>
//模板<类型名>
template <typename T>
struct specStack
{
stack <T> s;
stack <T> min;
//empty函数定义必须要用const。empty函数将返回一个布尔值。
bool empty() const
{
}
//push函数 无返回值,用void定义,且有参数。
void push(T param)
{
}
//pop函数。要先判空?非空才能进行pop
void pop()
{
}
//top函数。 要先判空?非空才能进行top
T top()
{
}
//size函数。有返回值,必须用int型。
int size()
{
}
};
int main()
{
//<>里面可以改变类型 。定义一个名叫s的栈
specStack <int> s;
}
下面提供两种思路:
s栈:用来保存当前栈中的元素。具有正常栈的功能。
min栈 :用于保存每一步的最小值。
思路一:
压入数据规则:
(1)将当前数据压入s栈。
(2)然后判断min栈是否为空,若为空,也压入min栈。
(3)若不为空;
·判断当前数据即s栈顶元素的值与min栈顶元素得治的大小;
如果s.top()<=min.top():则把当前数据(即s.top())也压入min栈
如果s.top()>min.top():则把min栈顶元素重复压入min栈(即min.push(min.top())
弹出规则:
(1)s栈弹出栈顶元素
(2)min栈弹出栈顶元素
具体实现代码:
#include <iostream>
#include <stack>
using std::stack;
using std::cout;
using std::endl;
template <typename T>
struct specStack
{
stack <T> s;
stack <T> min;
bool empty() const
{
return s.empty();
}
void push(T param)
{
s.push(param);
if(min.empty())
min.push(param);
else if(min.top()>s.top())
min.push(s.top());
else
min.push(min.top());
}
void pop()
{
if(!empty())
{
s.pop();
min.pop();
}
}
int size()
{
return s.size();
}
T GetMin()
{
if(!empty())
return min.top();
else
cout<<"ERROR:栈为空"<<endl;
}
T top()
{
if(!empty())
return s.top();
else
cout<<"ERROR:栈为空"<<endl;
}
};
int main()
{
specStack <int> s;
cout<<s.GetMin()<<endl;
cout<<s.top()<<endl;
s.push(4);
s.push(5);
cout<<s.GetMin()<<endl;
s.push(4);
cout<<s.GetMin()<<endl;
s.push(3);
s.push(2);
s.push(1);
cout<<s.GetMin()<<endl;
}
思路二:
压入数据规则:
(1)将当前数据压入s栈
(2)判断min栈是否为空
当min栈为空的时候,s栈的top值(即当前数据)压入min栈;
若min栈不为空,判断s栈栈顶元素与min栈栈顶元素的大小
如果s.top()<=min.top():则把当前数据(即s.top())压入min栈;
如果s.top()>min.top():则min栈不压入任何内容(与思路一的区别之处)
弹出数据规则:
(1)先判空?非空情况下进行如下操作
(2)先弹出s栈栈顶元素,设为value
(3)比较value与min栈栈顶元素大小(value的值值可能大于等于min栈栈顶元素)
当value=min.top();--------弹出min栈栈顶元素
当value>min.top();--------不弹出栈顶元素,返回value;
参考代码:
#include <iostream>
#include <stack>
using namespace std;
template <typename T>
struct specStack
{
stack <T> s;
stack <T> min;
bool empty() const
{
return s.empty();
}
T top()
{
if(!empty())
return s.top();
}
void push(T param)
{
s.push(param);
if(min.empty())
min.push(param);
else if(s.top()<=min.top())
min.push(s.top());
}
void pop()
{
if(empty())
cout<<"ERROR:栈为空"<<endl;
else
{
if(s.top()==min.top())
min.pop();
s.pop();
}
}
int size()
{
return s.size();
}
T GetMin()
{
if(!min.empty())
return min.top();
else
cout<<"ERROR:栈为空"<<endl;
}
};
int main()
{
specStack <int> s;
s.push(3);
s.push(4);
cout<<s.top()<<endl;
cout<<s.GetMin()<<endl;
s.push(5);
s.push(1);
s.push(2);
s.push(1);
cout<<s.GetMin()<<endl;
cout<<s.min.size()<<endl;
s.push(5);
s.push(1);
s.push(2);
s.push(1);
cout<<s.GetMin()<<endl;
}
题目来自于《程序员代码面试指南》。