STL之stack

本文深入解析了STL中stack的实现原理及内部结构,详细介绍了stack如何利用deque作为底层容器,并探讨了stack的基本操作,如empty、size、top、push和pop等。

       stack是以deque为底部容器,由于stack是以底部容器完成其所有工作,而具有这种性质者,称其为适配器,因此STL stack往往不被归类为容器,而被归类于container adapter。stack没有迭代器,stack只有顶端的元素才能被外界访问,所以,stack不提供走访功能。STL库中的vector,list,slist,deque都可以作为stack的底层容器。

#ifndef __SGI_STL_INTERNAL_STACK_H
#define __SGI_STL_INTERNAL_STACK_H

__STL_BEGIN_NAMESPACE

// 如果编译器不能根据前面模板参数推导出后面使用的默认参数类型,
// 那么就需要手工指定, 本实作stack内部容器默认使用deque
// 选用deque可以在存储空间不足时可以动态增加, 而且代价很低
#ifndef __STL_LIMITED_DEFAULT_TEMPLATES
template <class T, class Sequence = deque<T> >
#else
template <class T, class Sequence>
#endif
class stack
{
  // 特化的全局运算符, 提供operator==和<重载则构建出所有运算符
  // 其具体细节见<stl_pair.h>中的说明
  friend bool operator== __STL_NULL_TMPL_ARGS (const stack&, const stack&);
  friend bool operator< __STL_NULL_TMPL_ARGS (const stack&, const stack&);

public:
  // 由于stack仅支持对栈顶元素的操作, 所以不定义STL要求的
  // pointer, iterator, difference_type
  typedef typename Sequence::value_type value_type;
  typedef typename Sequence::size_type size_type;
  typedef typename Sequence::reference reference;
  typedef typename Sequence::const_reference const_reference;

protected:
  Sequence c;   // 这个是我们实际维护的容器

public:
  // 下面的操作完全使用内部容器的成员函数实现
  // 这再次体现了STL高度的可复用性:-)

  // 判断stack是否为空
  bool empty() const { return c.empty(); }

  // stack中元素个数
  size_type size() const { return c.size(); }

  // 返回栈顶元素, 注意这里返回的是引用!!!
  reference top() { return c.back(); }
  const_reference top() const { return c.back(); }

  // 在栈顶追加新元素
  void push(const value_type& x) { c.push_back(x); }

  // 移除栈顶元素, 注意不返回元素的引用,
  // 很多初学者随机用此容器时经常误认为pop()操作同时会返回栈顶元素的引用
  void pop() { c.pop_back(); }
};

// 判断两个stack是否相等, 就要测试其内部维护容器是否相等
// x.c == y.c会调用容器重载的operator ==
template <class T, class Sequence>
bool operator==(const stack<T, Sequence>& x, const stack<T, Sequence>& y)
{
  return x.c == y.c;
}

template <class T, class Sequence>
bool operator<(const stack<T, Sequence>& x, const stack<T, Sequence>& y)
{
  return x.c < y.c;
}

__STL_END_NAMESPACE

#endif /* __SGI_STL_INTERNAL_STACK_H */

// Local Variables:
// mode:C++
// End:

### C++ STL Stack 函数列表及用法 C++ STL 中的 `stack` 是一种容器适配器(container adapter),它提供了一种后进先出(LIFO, Last In First Out)的数据结构。`stack` 的主要操作包括压、弹和获取顶元素等[^1]。以下是 `stack` 的常用函数及其详细说明: #### 1. 构造函数 `stack` 可以通过默认构造函数或基于其他容器(如 `vector` 或 `deque`)进行初始化。默认情况下,`stack` 使用 `deque` 作为底层容器。 ```cpp std::stack<int> s; // 创建一个存储 int 类型的空 ``` #### 2. 压(push) 将一个元素压入顶。 ```cpp s.push(10); // 将 10 压入顶 ``` #### 3. 弹(pop) 移除顶元素。注意,`pop` 不会返回被移除的元素值,如果需要获取顶元素的值,应先调用 `top()`。 ```cpp s.pop(); // 移除顶元素 ``` #### 4. 获取顶元素(top) 返回顶元素的引用。如果为空,则行为未定义。 ```cpp int topElement = s.top(); // 获取顶元素 ``` #### 5. 判断是否为空(empty) 检查是否为空。如果为空,返回 `true`;否则返回 `false`。 ```cpp if (s.empty()) { // 为空时执行的代码 } ``` #### 6. 获取的大小(size) 返回中元素的数量。 ```cpp size_t size = s.size(); // 获取中元素的数量 ``` #### 示例代码 以下是一个完整的示例,展示了如何使用 `stack` 的基本功能: ```cpp #include <iostream> #include <stack> int main() { std::stack<int> s; // 压 s.push(10); s.push(20); s.push(30); // 输出顶元素 std::cout << "Top element: " << s.top() << std::endl; // 输出 30 // 弹 s.pop(); // 再次输出顶元素 std::cout << "Top element after pop: " << s.top() << std::endl; // 输出 20 // 检查是否为空 if (!s.empty()) { std::cout << "Stack is not empty." << std::endl; } // 输出的大小 std::cout << "Stack size: " << s.size() << std::endl; // 输出 2 return 0; } ``` #### 注意事项 - `stack` 的底层实现依赖于其他容器(如 `vector` 或 `deque`)。可以通过模板参数指定底层容器类型[^4]。 - `stack` 不支持随机访问或遍历操作,只能通过 `top()` 和 `pop()` 访问顶元素并移除。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值