1. 程式人生 > >《劍指offer》第三十題(包含min函數的棧)

《劍指offer》第三十題(包含min函數的棧)

data 題目 構造函數 color include 節點 () code 代碼

// 面試題30:包含min函數的棧
// 題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min
// 函數。在該棧中,調用min、push及pop的時間復雜度都是O(1)。

#include <iostream>
#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)//模板類的構造函數,好好看看這一行怎麽寫的 { // 把新元素添加到輔助棧 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//返回數據棧size { return m_data.size(); } //////////////////////////測試代碼/////////////////////////// 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); system("pause"); return 0; }

《劍指offer》第三十題(包含min函數的棧)