/************************************************
描述:
定义栈的数据结构,实现一个能找到栈的最小元素的
函数,要求:push、pop、和求最小元素的时间复杂
度都为O(1)
*************************************************/
/************************************************
实现方法:
定义两个栈,一个数据栈(存储数据),一个辅助栈
(当数据栈只有一个的时候将此数据push进辅助栈,
以后如果辅助栈栈顶的元素比待存放的数据小就将栈
顶的元素放到辅助栈,否则把带存放的数据放到辅助
栈),这样区最小的元素就可以去辅助栈的栈顶取。
*************************************************/
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<assert.h>
#include<stack>
void Push(const int value, stack<int>& s1, stack<int>& s2)
{
s1.push(value);
if (s2.size() == 0 || value < s2.top())
{
s2.push(value);
}
else
{
s2.push(s2.top());
}
}
void Pop(stack<int>& s1, stack<int>& s2)
{
assert(s1.size() > 0 && s2.size() > 0);
s1.pop();
s2.pop();
}
int Min(stack<int>& s1, stack<int>& s2)
{
assert(s1.size() > 0 && s2.size() > 0);
return s2.top();
}
void test()
{
stack<int> s1;//数据栈
stack<int> s2;//辅助栈
Push(3, s1, s2);
Push(4, s1, s2);
Push(2, s1, s2);
Push(1, s1, s2);
cout<<Min(s1, s2)<<endl;
Pop(s1, s2);
cout << Min(s1, s2) << endl;
Pop(s1, s2);
cout << Min(s1, s2) << endl;
Pop(s1, s2);
cout << Min(s1, s2) << endl;
}
int main()
{
test();
return 0;
}
每次弹出一个栈的最小元素
最新推荐文章于 2021-07-21 20:12:37 发布