C++中stack的deque实现



本文实现了STL中stack的大部分功能,同时添加了一些功能。

注意以下几点:

1.Stack是一种适配器,底层以vector、list、deque等实现

2.Stack不含有迭代器

在本例中,我添加了几项功能,包括不同类型stack之间的复制和赋值功能,可以实现诸如Stack<int, vector<int> >和Stack<double, list<double> >之间的复制和赋值,这主要依靠成员函数模板来实现。

为了更方便的实现以上功能,我添加了一个函数:

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 <deque>

//栈空引发的异常
class EmptyStackException : public Exception
{
public:
    EmptyStackException() :Exception("read empty stack") { }
};

template <typename T, typename Container = std::deque<T> >
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 <typename T2, typename Container2>
    Stack<T, Container>(const Stack<T2, Container2> &s); 

    //不同类型间进行赋值
    template <typename T2, typename Container2>
    Stack<T, Container> &operator=(const Stack<T2, Container2> &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 <typename T, typename Container>
template <typename T2, typename Container2>
Stack<T, Container>::Stack(const Stack<T2, Container2> &s)
    :cont_(s.get_container().begin(), s.get_container().end())
{

}

template <typename T, typename Container>
template <typename T2, typename Container2>
Stack<T, Container> &Stack<T, Container>::operator=(const Stack<T2, Container2> &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 <iostream>
#include <string>
#include <vector>
#include <list>
#include <stdio.h>
using namespace std;

int main(int argc, char const *argv[])
{

    try
    {
        Stack<string, vector<string> > st;
        st.push("foo");
        st.push("bar");

        Stack<string, list<string> > 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

时间: 2024-10-17 08:19:15

C++中stack的deque实现的相关文章

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

vs中 Stack around the variable &#39;XXX&#39; was corrupted.

https://blog.csdn.net/hou09tian/article/details/75042206 把 project->配置属性->c/c++->代码生成->基本运行时检查 为 默认值 就不会报本异常.具体原因正在研究中... 如果改为其他就有exception. exception有时是有道理的 // step 1 STRINGC2& STRINGC2::operator += (const char x) { // if (x == 0) return 

C#中Stack&amp;lt;T&amp;gt;类的使用及部分成员函数的源代码分析

Stack<T>类 Stack<T> 作为数组来实现. Stack<T> 的容量是 Stack<T> 能够包括的元素数. 当向 Stack<T> 中加入元素时,将通过又一次分配内部数组来依据须要自己主动增大容量. 可通过调用 TrimExcess 来降低容量. 假设 Count 小于堆栈的容量,则 Push 的运算复杂度是 O(1). 假设须要添加容量以容纳新元素,则 Push 的运算复杂度成为 O(n).当中 n 为 Count. Pop 的运

stl 中List vector deque区别

stl提供了三个最基本的容器:vector,list,deque.         vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此     它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间     进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新     申请一块足够大的内存并进行内存的拷贝.这些都大大影响了vector的效率.         list就是数据结构中的双向链表(根据sgi   s

C#中Stack&lt;T&gt;类的使用及部分成员函数的源码分析

Stack<T>类 Stack<T> 作为数组来实现. Stack<T> 的容量是 Stack<T> 可以包含的元素数. 当向 Stack<T> 中添加元素时,将通过重新分配内部数组来根据需要自动增大容量. 可通过调用 TrimExcess 来减少容量. 如果 Count 小于堆栈的容量,则 Push 的运算复杂度是 O(1). 如果需要增加容量以容纳新元素,则 Push 的运算复杂度成为 O(n),其中 n 为 Count. Pop 的运算复杂

python 中的queue, deque

创建双向队列 import collections d = collections.deque() append(往右边添加一个元素) import collections d = collections.deque() d.append(1) d.append(2) print(d) #输出:deque([1, 2]) appendleft(往左边添加一个元素) import collections d = collections.deque() d.append(1) d.appendlef

【python】Numpy中stack(),hstack(),vstack()函数详解

转自 https://blog.csdn.net/csdn15698845876/article/details/73380803 这三个函数有些相似性,都是堆叠数组,里面最难理解的应该就是stack()函数了,我查阅了numpy的官方文档,在网上又看了几个大牛的博客,发现他们也只是把numpy文档的内容照搬,看完后还是不能理解,最后经过本人代码分析,算是理解了stack()函数增加维度的含义.以下内容我会用通俗易懂的语言解释,内容可能有点多,耐心看,如果哪里说的不对,欢迎纠正! 1. stac

C++ stack,queue,vector 中 易混淆的常用方法 浅析

C++ 中stack,queue,vector是常见的数据结构,它们分别封装在<stack>,<queue>,<vector>头文件中. stack,queue,vector的定义如下: stack<class T> s; queue<class T> q; vector<class T> v; stack常用方法: push()的向容器顶部里插入元素: pop()是删除容器顶部的元素: top()返回容器顶部的元素: size()返

26 python 中deque模块详解

deque模块是python标准库collections中的一项,它提供了两端都可以操作的序列,这意味着,在序列的前后你都可以执行添加或删除操作. 1.创建deque序列: from collections import deque d=deque() 2.deque提供了类似list的操作方法: d=deque() d.append(3) d.append(8) d.append(1) 那么此时 d=deque([3,8,1]),len(d)=3,d[0]=3,d[-1]=1 3.两端都使用p