您的位置:首页 > 其它

算法7:设计一个class,类似于stack, 但可以是O(1)时间内返回min()

2017-03-07 14:08 417 查看

解题思路

类中存一个数据栈和一个辅助栈,向数据栈push的时候,判断当前值与辅助栈栈顶的值的大小,如果小则push到辅助栈,否则push辅助栈的栈顶数值到辅助栈;向数据栈pop时,同时pop辅助栈的值。获取当前数值最小值即辅助栈栈顶数据,时间复杂度为O(1)

MinStack类定义

#include <stack>

using namespace std;

class MinStack
{
public:
MinStack();
~MinStack();
//栈的push操作
void Push(int value);
//栈的pop操作
int Pop();
//获取最小值操作
int Min();
//判断栈是否为空
bool IsEmpty();

private:
stack<int> dataStack;
stack<int> minStack;
};


MinStack类实现

#include "stdafx.h"
#include "MinStack.h"
#include <iostream>

using namespace std;

MinStack::MinStack()
{

}

MinStack::~MinStack()
{

}

void MinStack::Push(int data)
{
dataStack.push(data);

//向minStack push当前最小值
if(minStack.empty() || data < minStack.top())
{
minStack.push(data);
}
else
{
minStack.push(minStack.top());
}
}

int MinStack::Pop()
{
if(IsEmpty())
{
cout<<"stack is empty,can't pop"<<endl;
return -1;
}

//获取栈顶数据
int data = dataStack.top();

dataStack.pop();
minStack.pop();

return data;
}

bool MinStack::IsEmpty()
{
if(dataStack.empty())
{
return true;
}

return false;
}

int MinStack::Min()
{
if(minStack.empty())
{
cout<<"min stack is empty"<<endl;
return -1;
}

return minStack.top();
}


测试代码

#include "stdafx.h"
#include "MinStack.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"please input minStack"<<endl;
MinStack minStack;
int data = 0;

for(int i = 0; i < 8; i++)
{
cin>>data;
minStack.Push(data);
cout<<"min data is "<<minStack.Min()<<endl;
}

minStack.Pop();
cout<<"after pop one data, the min data is "<<minStack.Min()<<endl;

minStack.Pop();
cout<<"after pop one data, the min data is "<<minStack.Min()<<endl;

minStack.Pop();
cout<<"after pop one data, the min data is "<<minStack.Min()<<endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法
相关文章推荐