Kai’blog

主博客 | 势利纷华,近之而不染者洁,不近者亦洁,君子不立危墙之下。

浅谈“栈”

栈(statck)是一种先进后出的(First In Last Out, FILO)的数据结构。栈只允许在栈顶上添加元素、弹出栈顶元素、获取栈顶元素等简单操作。在STL中,栈是以双端队列(deque)作为底部结构实现非的,效率很高,甚至比手写栈效率还高,因为尽管deque和数组一样是连续空间,但有更智能的内存管理,在大多是情况下,常数都低于手写版本的常数,因而在算法竞赛中,更常使用STL提供的stack,如果要进行stack未提供的操作,也可以改用deque————同样无需手写。

stack常用接口

先来看一下VS2008中的std::stack的源码:

template<class _Ty, class _Container = deque<_Ty> >
class stack
{
public:
    typedef _Container container_type;
    typedef typename _Container::value_type value_type;
    typedef typename _Container::size_type size_type;
    typedef typename _Container::reference reference;
    typedef typename _Container::const_reference const_reference;
    stack() : c(){}
    explicit stack(const _Container& _Cont) : c(_Cont){}
    bool empty() const
    {
        return (c.empty());
    } 
    size_type size() const
    {
        return (c.size());
    }
    reference top()
    {
	return (c.back());
    }
    const_reference top() const
    {
	return (c.back());
    }
    void push(const value_type& _Val)
    {
        c.push_back(_Val);
    }
    void pop()
    {
        c.pop_back();
    }
    const _Container& _Get_container() const
    {
	return (c);
    }
protected:
	_Container c;
};

相信能看懂的人此刻都会相视一笑————stack简单的连STL都不屑于把实现和定义分开......

从源码中已经可以获取一切信息了,stack就是一个只提供了部分接口的deque,调用stack的成员函数就是间接调用deque的成员函数,另外,为了严格遵循堆栈的数据后进先出原则,stack 不提供元素的任何迭代器操作。(欲成堆栈,必先被阉?强行降低实用性什么鬼

成员函数简介

创建 stack 对象
使用堆栈前,先要利用构造函数进行初始化,创建一个堆栈对象,以进行元素的入栈、出栈等操作。

  • stack() 默认构造函数,创建一个空的 stack 对象。
  • stack(const stack&) 复制构造函数,用一个 stack 堆栈创建一个新的堆栈。
  • empty() 堆栈为空则返回真
  • pop() 移除栈顶元素
  • push() 在栈顶增加元素
  • size() 返回栈中元素数目
  • top() 返回栈顶元素

小结

堆栈是一种应用非常广泛的数据结构。C++ STL 将这种数据结构和它若干受限制操作用泛型类 stack 容器封装出来,包括堆栈初始化、元素入栈、取栈顶元素、元素出栈、判断堆栈是否非空和取得当前堆栈大小等,应用起来十分容易。
stack的元素出栈操作是不返回栈顶元素的,需要另外通过取栈顶函数获得。这种分离实现是考虑到出栈函数若直接返回栈顶元素,将会导致返回值的数据引用安全问题或不必要的低效复制函数的调用。
从 stack 内部实现看,stack 堆栈是不设最大容量的,但可通过 size 函数获取当前堆栈的大小,以判断是否允许继续让元素入栈,实现具有最大容量限制的堆栈。

posted @ 2019-11-24 21:06  Kai-G  阅读(253)  评论(0编辑  收藏  举报
Copyright © 2019-2020 拱垲. All rights reserved.