(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章