C++ STL Container--Stack

栈是一种先进后出(LIFO)的数据结构,限制只能在一端完成插入和删除操作,这一端叫做栈顶(top),另一端即为栈底(bottom)。C++ STL(Standrad Template Libarary)中stack容器泛化是使用现成的序列容器来实现的,默认使用双端队列dequeue来实现,也可以使用vector、list等线性结构。

为了严格遵循栈的先进后出原则,stack不提供任何元素的迭代器操作,因此,stack容器不会向外部提供任何可用的前向或反向迭代器类型。

构造

template <class T, class Container = deque > class stack;

构造函数主要有两个参数:class T 指定栈中存储的元素类型, class Container = deque指定底层实现栈的容器类型,默认是双端队列。

    stack<int> S(); //默认底层使用deque实现,创建一个空的堆栈对象
stack<int, list<int>> S(); //指定使用list<int> 实现栈; stack<T> S(const stack&); // 复制构造函数
list<int> L(2,200);
stack<int, list<int>> S(L);

栗子:

#include <iostream>
#include <stack>
#include <vector>
#include <dequeue>
using namespace std; int main()
{
stack<int> first;
deque<int> mydeque (2,300);
stack<int> second (mydeque); stack<int, vector<int>> third;
vector<int> myvector (2, 100);
stack<int, vector<int>> fourth (myvector); cout << "size of the first stack: " << first.size() << endl;
cout << "size of the second stack: " << second.size() << endl;
cout << "size of the third stack: " << third.size() << endl;
cout << "size of the fourth stack: " << fourth.size() << endl;
return 0; }

成员函数

stack<int> S1;
stack<int> S2(S1);
/*成员函数原型:
void push(const value_type&x);
void pop();//这两个函数都不会预先检查堆栈满或是空
value_type& top();
bool empty();
int size();
*/

栗子:

#include <iostream>
#include <stack>
using namespace std; int main()
{
stack<int> S;
for (int i = 0; i < 5; i++) S.push(i);
cout << S.size() << endl;
while(!S.empty())
{
cout << S.top() << " ";
S.pop();
}
return 0;
}

栗子二:

#include <iostream>
#include <stack>
using namespace std; struct Node
{
int a, b;
Node (int x, int y)
{
a = x; b = y;
}
}; void printStack(stack<Node> &s)
{
int i = 0;
stack<Node> s1(s);
while(!s1.empty())
{
Node p = s1.top();
cout << "the " << ++i << "-th: ";
cout << p.a << " " << p.b << endl;
s1.pop();
}
}
int main()
{
stack<Node> mystack;
mystack.emplace(1,2); //emplace可以将一个元素加入栈中,与push的不同在于,emplace可以直接传入Node的构造函数的参数,并将构造的元素插到栈顶
mystack.emplace(1,3);
printStack(mystack); stack<Node> my2;
my2.emplace(2,3);
my2.emplace(2,1);
my2.swap(mystack); //swap函数可以交换两个栈的元素
cout << "mystack:"<<endl;
printStack(mystack);
cout << "my2:"<<endl;
printStack(my2);
return 0;
}

表1. stack常用成员函数示例

函数原型 复杂度
int size(); O(1)
value_type& top(); O(1)
void pop(); O(1)
void push(const value_type& x); O(1)
bool empty(); O(1)

C++ STL 常用容器之 stack的更多相关文章

  1. C++ STL容器之 stack

    STL 中的 stack 是一种容器适配器,而不是一种容器. 它是容器适配器是指,只要支持一系列方法的容器(empty, size, back, push_back, pop_back),都能作为st ...

  2. STL序列容器之deque

    一,deque的基础知识 1.deque的基础 deque是“double-ended-queue”的缩写,意思是双端队列,其和vector的区别在于vector是单端的. deque在头部和尾部插入 ...

  3. STL序列容器之vector

    一,vector容器简介 1.vector容器的原理 vector是将元素置于一个动态数组中加以管理的容器. 2.vector容器的特点 vector容器可以随机存取元素,支持索引存取(即用数组下标的 ...

  4. [知识点]C++中STL容器之map

    UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...

  5. [知识点]C++中STL容器之set

    零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 继上期的vector之后,我们又迎来了另一个类数组的STL容器——set. 二.用途与特性 set,顾名思义,集合 ...

  6. [知识点]C++中STL容器之vector

    零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...

  7. Java并发编程:并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...

  8. Java并发编程:并发容器之ConcurrentHashMap

    转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...

  9. 【转】Java并发编程:并发容器之ConcurrentHashMap

    JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...

随机推荐

  1. java基础进阶篇(四)_HashMap------【java源码栈】

    目录 一.前言 二.特点和常见问题 二.接口定义 三.初始化构造函数 四.HashMap内部结构 五.HashMap的存储分析 六.HashMap的读取分析 七.常用方法 八.HashMap 的jav ...

  2. iMX287A基于嵌入式Qt的新冠肺炎疫情监控平台

    目录 1.前言 2.数据接口的获取 3.Qt界面的实现 4.在开发板上运行Qt程序 5.最终效果 6.代码下载 @ 1.前言 之前我使用在桌面版本Qt实现了肺炎疫情监控平台:基于Qt的新冠肺炎疫情数据 ...

  3. PAT资料,持续更新中~~~愿诸君共勉

    <算法笔记>胡凡著,<算法笔记-上机实战训练指南>胡凡著 <经典算法大全> <C陷阱与缺陷> <C程序设计语言-K&R> 链接:ht ...

  4. 百度地图API-创建多个坐标,连线,信息提示

    这是一个多坐标创建,并连线,和信息显示的例子 <!DOCTYPE html> <html> <head> <meta http-equiv="Con ...

  5. Oracle 11g rac开启归档

    Oracle 11g rac开启归档 查看目前归档状态 #节点1 ykws1 SQL> archive log list; Database log mode No Archive Mode A ...

  6. 纯 css column 布局实现瀑布流效果

    原理 CSS property: columns.CSS属性 columns 用来设置元素的列宽和列数. 兼容性 chrome 50+ IE 10+ android browser 2.1+ with ...

  7. 浅谈Java中静态代码块和非静态代码块

    静态代码块: static{} 执行优先级高于非静态的初始化块,它会在类初始化(类初始化这个问题改天再详细讨论)的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员. 非静 ...

  8. JVM03——四种垃圾回收算法,你都了解了哪几种

    在之前的文章中,已经为各位带来了JVM的内存结构与堆内存的相关介绍,今天将为为各位详解JVM垃圾回收与算法.关注我的公众号「Java面典」了解更多 Java 相关知识点. 如何确定垃圾 想要回收垃圾, ...

  9. 数学-Matrix Tree定理证明

    老久没更了,冬令营也延期了(延期后岂不是志愿者得上学了?) 最近把之前欠了好久的债,诸如FFT和Matrix-Tree等的搞清楚了(啊我承认之前只会用,没有理解证明--),FFT老多人写,而Matri ...

  10. Pocket+Evernote 打造个人知识库体系

    俗话说巧妇难为无米之炊,还是那个不太恰当的例子. 写作就好比人类的消化系统,想要持续的输出...那么就要持续的输入... 今天就来说一说如何进行持续有效的输入. 信息处理过程 先放一张图,这是我的整个 ...