(C++)设计一个有getmin功能的栈

说明:编程菜鸟一枚,学习左程云老师的《程序员代码面试指南》过程中将书中的例子改写成C++实现

题目

实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作。

要求

1、pop、push、getMin操作的时间复杂度都是O(1)
2、设计的栈类型可以输用现成的栈结构

详细解析见《程序员代码面试指南》第一章第一题
方案一C++代码

#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;

template <class T>
class Stack {
    public:
        void push(int num){
            if(stackmin.empty()){
                stackmin.push(num);
            }
            else if(num<stackmin.top()){
                stackmin.push(num);
            }
            stackdata.push(num);
        };
        int pop(){
            assert(!stackdata.empty() && !stackmin.empty());
            int temp=stackdata.top();
            if(temp==stackmin.top()){
                stackmin.pop();
                }
            stackdata.pop();
            return temp;
        };
        int getmin(){
            assert(!stackmin.empty());
            return stackmin.top();
        };
    private:
        stack<int> stackdata;
        stack<int> stackmin;

};

int main()
{
    Stack<int> example1;
    cout<<"build example1"<<endl;
    example1.push(1);
    example1.push(2);
    example1.push(5);
    example1.pop();

    int min1=example1.getmin();
    cout<<min1<<endl;
}

方案二C++代码

#include <iostream>
#include <stack>
#include <assert.h>
using namespace std;

template <class T>
class Stack {
    public:
        void push(int num){
            if(stackmin.empty()){
                stackmin.push(num);
            }
            else if(num<stackmin.top()){
                stackmin.push(num);
            }
            else{
                stackmin.push(stackmin.top());
            }
            stackdata.push(num);
        };
        int pop(){
            assert(!stackdata.empty() && !stackmin.empty());
            stackmin.pop();
            int temp=stackdata.top();
            stackdata.pop();
            return temp;
        };
        int getmin(){
            assert(!stackmin.empty());
            return stackmin.top();
        };
    private:
        stack<int> stackdata;
        stack<int> stackmin;

};

int main()
{
    Stack<int> example1;
    cout<<"build example1"<<endl;
    example1.push(1);
    example1.push(2);
    example1.push(5);
    example1.pop();

    int min1=example1.getmin();
    cout<<min1<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章