您的位置:首页 > 职场人生

栈和队列相关面试题(1)

2017-04-07 15:24 211 查看
题目:实现一个栈,要求实现Push(出栈)、Pop(入栈)、Min(返回最小值的操作)的时间复杂度为O(1)。

方法一:

使用一个栈。元素x入栈时,执行一次push(x),再push(min),min表示当前栈顶到栈底元素最小值;元素出栈时,执行两次pop() 。



缺点:当第一个元素就是带插入所有元素中最小时,每次push都需要重复push相同元素,浪费了很多不必要的空间,操作冗余。

方法二:

使用两个栈s1和s2,s2做为辅助栈(每次压入s2的都是s1的最小值)

元素x入栈时,将x和s2栈顶元素做比较,如果x小于等于s2.top(),将x分别push到s1和s2,否则x只push到s1 ;

元素出栈时,将s1栈顶元素和s2栈顶元素做比较,如果s1.top()等于s2.top(),s1和s2都执行pop操作,否则只执行s1.pop() 。





typedef int T;
class StackWithMin
{
public:
StackWithMin()
{}
~StackWithMin()
{}
void Push(T x)//如果x小于等于s2.top(),将x分别push到s1和s2,否则x只push到s1
{
s1.push(x);
if (s2.empty() || x <= s2.top())
{
s2.push(x);
}
}
void Pop()//如果s1.top()等于s2.top(),s1和s2都执行pop操作,否则只执行s1.pop() 。
{
if (s1.top() == s2.top())
{
s2.pop();
}
s1.pop();
}
T Min()
{
if (!s2.empty())
{
return s2.top();
}
}
void Print()
{
while (!s1.empty())
{
cout << s1.top() << "->";
s1.pop();
}
cout << endl;
while (!s2.empty())
{
cout << s2.top() << "->";
s2.pop();
}
cout << endl;
}
private:
stack<T> s1, s2;
};
int main()
{
StackWithMin s;
s.Push(8);
s.Push(4);
s.Push(3);
s.Push(5);
s.Push(2);
s.Push(5);
cout << s.Min();
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: