C++ STL 常用容器之 stack
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的更多相关文章
- C++ STL容器之 stack
STL 中的 stack 是一种容器适配器,而不是一种容器. 它是容器适配器是指,只要支持一系列方法的容器(empty, size, back, push_back, pop_back),都能作为st ...
- STL序列容器之deque
一,deque的基础知识 1.deque的基础 deque是“double-ended-queue”的缩写,意思是双端队列,其和vector的区别在于vector是单端的. deque在头部和尾部插入 ...
- STL序列容器之vector
一,vector容器简介 1.vector容器的原理 vector是将元素置于一个动态数组中加以管理的容器. 2.vector容器的特点 vector容器可以随机存取元素,支持索引存取(即用数组下标的 ...
- [知识点]C++中STL容器之map
UPDATE(20190416):写完vector和set之后,发现不少内容全部引导到map上了……于是进行了一定的描述补充与更正. 零.STL目录 1.容器之map 2.容器之vector 3.容器 ...
- [知识点]C++中STL容器之set
零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 继上期的vector之后,我们又迎来了另一个类数组的STL容器——set. 二.用途与特性 set,顾名思义,集合 ...
- [知识点]C++中STL容器之vector
零.STL目录 1.容器之map 2.容器之vector 3.容器之set 一.前言 关于STL和STL容器的概念参见STL系列第一篇——map(见上).今天介绍第二个成员——vector. 二.用途 ...
- Java并发编程:并发容器之ConcurrentHashMap(转载)
Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concu ...
- Java并发编程:并发容器之ConcurrentHashMap
转载: Java并发编程:并发容器之ConcurrentHashMap JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的 ...
- 【转】Java并发编程:并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了 ...
随机推荐
- 如何在自己的CSDN博客中增添【高大上】的博客栏目?
前几天看到过一位博主的博客界面,向下看 ☟ (博主对不起啊!把你的公众号给抹了~~~),感觉做这个东西挺好玩的,而且我竟然找不到在哪个地方可以设置!在百度上也没有搜到教程,最后问了一下贺老师知道了入口 ...
- 浅谈ConcurrentDictionary与Dictionary
在.NET4.0之前,如果我们需要在多线程环境下使用Dictionary类,除了自己实现线程同步来保证线程安全外,我们没有其他选择.很多开发人员肯定都实现过类似的线程安全方案,可能是通过创建全新的线程 ...
- Javascript学习笔记-基本概念-操作符
1.一元操作符 (1)递增和递减操作符 只能操作一个值的操作符叫一元操作符. var age = 29; ++age; var age = 29; --age; var age = 29; var a ...
- java 初探-猜数字
学习Java而编写的猜数字的程序代码. /** * */ package org.literal.test; import java.util.Scanner; /** * @author liter ...
- 关于图数据库HugeGraph的百万,千万,亿量级测试
1.Hugegraph测试硬件 1.1.本机硬件 本机测试hugeGraph版本:0.10.4 后置存储数据库:rocksdb,1TB的普通硬盘 1.2.测试服务器硬件 测试服务器hugegraph版 ...
- javascript常用工具函数总结(不定期补充)未指定标题的文章
前言 以下代码来自:自己写的.工作项目框架上用到的.其他框架源码上的.网上看到的. 主要是作为工具函数,服务于框架业务,自身不依赖于其他框架类库,部分使用到es6/es7的语法使用时要注意转码 虽然尽 ...
- 利用canvas绘画二级树形结构图
上周需要做一个把页面左侧列表内容拖拽到右侧区域,并且绘制成关系树的功能.看了设计图,第一反应是用canvas绘制关系线.吭哧吭哧搞定这个功能后,发现用canvas绘图,有一个很严重的缺陷.那就是如果左 ...
- springmvc与swagger2
首先呢我们导入相关的jar包文件 为了方便copy我copy一份 <!-- 导入java ee jar 包 --> <dependency> ...
- Alibaba Sentinel 限流与熔断初探(技巧篇)
目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...
- docker报错Error response from daemon: driver failed programming external connectivity on endpoint *
服务端 通常会显示 port xxx allocated的,意思就是 xxx 端口被占用了. 如果报port allocated端口占用,就docker ps 查看正使用的镜像,docker kill ...