题目
定义栈的数据结构,请在该类型中实现一个能过得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。
解题思路
利用辅助栈的思想:把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放到另一个辅助栈里,可以实现min的时间复杂度为O(1)。
C++实现
.h头文件
#pragma once
#include <stack>
#include <assert.h>
template <typename T>
class StackWithMin
{
public:
StackWithMin() {}
virtual ~StackWithMin() {}
T& top();
const T& top() const; //指向常量函数的常量引用
void push(const T& value);
void pop();
const T& min() const;
bool empty() const;
size_t size() const;
private:
std::stack<T> m_data;
std::stack<T> m_min;
};
template <typename T>
void StackWithMin<T>::push(const T& value)
{
// push操作
m_data.push(value);
if (m_min.size() == 0 || value < m_min.top())
m_min.push(value);
else
m_min.push(m_min.top());
}
template <typename T>
void StackWithMin<T>::pop()
{
assert(m_data.size() > 0 && m_min.size() > 0);
m_data.pop();
m_min.pop();
}
template <typename T> const T& StackWithMin<T>::min() const
{
assert(m_data.size() > 0 && m_min.size() > 0);
return m_min.top();
}
template <typename T> T& StackWithMin<T>::top()
{
return m_data.top();
}
template <typename T> const T& StackWithMin<T>::top() const
{
return m_data.top();
}
template <typename T> bool StackWithMin<T>::empty() const
{
return m_data.empty();
}
template <typename T> size_t StackWithMin<T>::size() const
{
return m_data.size();
}
.cpp文件
//stdio.h是以往的C和C++的头文件,cstdio是标准C++(STL),且cstdio中的函数都是定义在一个名称空间std里面的,
//如果要调用这个名字空间的函数,必须得加std::或者在文件中声明using namespace std。 stdio.h==cstdio
#include <stdio.h>
#include "StackWithMin.h"
void Test(const char* testName, const StackWithMin<int>& stack, int expected)
{
if (testName != nullptr)
printf("%s begins: ", testName);
if (stack.min() == expected)
printf("Passed.\n");
else
printf("Failed.\n");
}
int main(int argc, char* argv[])
{
StackWithMin <int>stack;
stack.push(3);
Test("Test1", stack, 3);
stack.push(4);
Test("Test2", stack, 3);
stack.push(2);
Test("Test3", stack, 2);
stack.push(3);
Test("Test4", stack, 2);
stack.pop();
Test("Test5", stack, 2);
stack.pop();
Test("Test6", stack, 3);
stack.pop();
Test("Test7", stack, 3);
stack.push(0);
Test("Test8", stack, 0);
return 0;
}