设计包含min函数的栈

来源:互联网 发布:ff14拉拉菲尔捏脸数据 编辑:程序博客网 时间:2024/06/05 03:48


题目:

定义栈的数据结构,在该类型中实现一个能够得到栈的最小元素的min函数。

分析:

1.设计一个数据栈,用于压入、弹出元素
2.设计一个辅助栈,用来存放最小元素。第一个先放进去,若后边的元素比较小,则将其压入辅助栈,否则压入辅助栈中最小的元素。
3.弹出一个数据栈的元素,弹出一个辅助栈的元素,满足弹出元素后还能得到次小

#include "stdafx.h"#include<iostream>#include<stack>#include<assert.h>using namespace std;template <typename T> class StackWithMin{public:StackWithMin(void){}virtual ~StackWithMin(void){}T& top(void);const T& top(void) const;void push(const T& value);void pop(void);const T& min(void) 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);elsem_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();}int _tmain(int argc, _TCHAR* argv[]){ StackWithMin<int> stack;    cout<< "栈中压入3:3->"<<endl;    stack.push(3);cout<< "栈中最小的数是:"<<endl;cout << stack.min() << endl;    stack.push(4);cout<< "栈中压入4:3->4"<<endl;cout<< "栈中最小的数是:"<<endl;cout << stack.min() << endl;cout<< "栈中压入2:3->4->2"<<endl;    stack.push(2);cout<< "栈中最小的数是:"<<endl;cout << stack.min() << endl;cout<< "栈中压入3:3->4->2->3"<<endl;    stack.push(3);cout<< "栈中最小的数是:"<<endl;cout << stack.min() << endl;    stack.pop();    stack.pop();    stack.pop();stack.pop();     system("pause");    return 0;}


0 0
原创粉丝点击