程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++中stack的deque實現

C++中stack的deque實現

編輯:C++入門知識

C++中stack的deque實現




本文實現了STL中stack的大部分功能,同時添加了一些功能。

注意以下幾點:

1.Stack是一種適配器,底層以vector、list、deque等實現

2.Stack不含有迭代器

在本例中,我添加了幾項功能,包括不同類型stack之間的復制和賦值功能,可以實現諸如Stack >和Stack >之間的復制和賦值,這主要依靠成員函數模板來實現。

為了更方便的實現以上功能,我添加了一個函數:

const_container_reference get_container() const

來獲取內部容器的引用。

此外,標准庫的stack不檢查越界行為,我為stack添加了異常處理,當棧空時,執行pop或者top會拋出異常。這個異常類繼承自Exception(見上篇文章),用來標示棧空。

詳細代碼如下:Exception的實現見:借助backtrace和demangle實現異常類Exception

復制代碼
#ifndef STACK_HPP_
#define STACK_HPP_

#include "Exception.h"
#include 

//棧空引發的異常
class EmptyStackException : public Exception
{
public:
    EmptyStackException() :Exception("read empty stack") { }
};


template  >
class Stack
{
public:
    typedef T value_type;
    typedef T& reference;
    typedef const T& const_reference;
    typedef Container container_type; //容器類型
    typedef EmptyStackException exception_type; //異常類型
    typedef typename Container::size_type size_type;
    typedef Container &container_reference; //容器引用
    typedef const Container& const_container_reference;

    Stack() { }

    //不同類型間實現復制
    template 
    Stack(const Stack &s); 

    //不同類型間進行賦值
    template 
    Stack &operator=(const Stack &s);

    void push(const value_type &val) { cont_.push_back(val); }
    void pop() 
    { 
        if(cont_.empty())
            throw exception_type();
        cont_.pop_back(); 
    }

    reference top()
    {
        if(cont_.empty())
            throw exception_type();
        return cont_.back();
    } 
    const_reference top() const
    {
        if(cont_.empty())
            throw exception_type();
        return cont_.back();
    }

    bool empty() const { return cont_.empty(); }
    size_type size() const { return cont_.size(); }

    //獲取內部容器的引用
    const_container_reference get_container() const
    { return cont_; } 


    friend bool operator==(const Stack &a, const Stack &b)
    {
        return a.cont_ == b.cont_;
    }
    friend bool operator!=(const Stack &a, const Stack &b)
    {
        return a.cont_ != b.cont_;
    }
    friend bool operator<(const Stack &a, const Stack &b)
    {
        return a.cont_ < b.cont_;
    }
    friend bool operator>(const Stack &a, const Stack &b)
    {
        return a.cont_ > b.cont_;
    }
    friend bool operator<=(const Stack &a, const Stack &b)
    {
        return a.cont_ <= b.cont_;
    }
    friend bool operator>=(const Stack &a, const Stack &b)
    {
        return a.cont_ >= b.cont_;
    }

private:
    Container cont_;
};

template 
template 
Stack::Stack(const Stack &s)
    :cont_(s.get_container().begin(), s.get_container().end())
{

}

template 
template 
Stack &Stack::operator=(const Stack &s)
{
    if((void*)this != (void*)&s) 
    {
        cont_.assign(s.get_container().begin(), s.get_container().end());
    }
    
    return *this;
}


#endif /* STACK_HPP_ */
復制代碼

測試代碼如下:

復制代碼
#include "Stack.hpp"
#include 
#include 
#include 
#include 
#include 
using namespace std;

int main(int argc, char const *argv[])
{
   
    try
    {
        Stack > st;
        st.push("foo");
        st.push("bar");

        Stack > st2(st);
        //st2 = st;

        while(!st2.empty())
        {
            cout << st2.top() << endl;
            st2.pop();
        }

        st2.pop(); //引發異常
    }
    catch (const Exception& ex)
    {
        fprintf(stderr, "reason: %s\n", ex.what());
        fprintf(stderr, "stack trace: %s\n", ex.stackTrace());
    }

    return 0;
}
復制代碼 http://www.cnblogs.com/inevermore/p/4006267.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved