c++栈、堆、队列、双向队列

c++栈、堆、队列、双向队列的使用
C++栈stack
首先看一下原c++栈的方法的基本用法:
push(): 向栈内压入一个成员;
pop(): 从栈顶弹出一个成员;
empty(): 如果栈为空返回true,否则返回false;
top(): 返回栈顶,但不删除成员;
size(): 返回栈内元素的大小;

C++队列Queue
C++队列Queue类成员函数如下:
back()返回最后一个元素
empty()如果队列空则返回真
front()返回第一个元素
pop()删除第一个元素
push()在末尾加入一个元素
size()返回队列中元素的个数
C++双向队列deque

构造函数:
deque c ; //产生一个空的deque,其中没有任何元素
deque c1(c2); //产生另一个同型deque的副本(所有元素都被拷贝)
deque c(n) ; //产生一个大小为n的deque
deque c(n , elem) ; //产生一个大小为n的deque,
//每个元素值都是elem。
dequer c(begin,end); //产生一个deque,以区间[begin ; end]
//做为元素初值

析构函数:
c.~ deque() ;销毁所有元素,并释放内存。

非变动性操作
c.size(); //返回当前的元素数量
c.empty(); //判断大小是否为零。等同于c.size() == 0,但可能更快
c.max_size(); //可容纳元素的最大数量
c.at(idx) ; //返回索引为idx所标示的元素。如果idx越界,抛出out_of_range
c[idx] ; //返回索引idx所标示的元素。不进行范围检查
c.front() ; //返回第一个元素,不检查元素是否存在
c.back(); //返回最后一个元素
c.begin(); //返回一个随机迭代器,指向第一个元素
c.end(); //返回一个随机迭代器,指向最后元素的下一位置

变动性操作:
c1 = c2 ; //将c2的所有元素赋值给c1;
c.assign(n , elem); //将n个elem副本赋值给c
c.assing(beg , end); //将区间[beg;end]中的元素赋值给c;
c.push_back(elem); //在尾部添加元素elem
c.pop_back() ; //移除最后一个元素(但不回传)
c.push_front() ; //在头部添加元素elem
c.pop_front() ; //移除头部一个元素(但不回传)
c.erase(pos) ; //移除pos位置上的元素,返回一元素位置
//如 c.erase( c.begin() + 5) //移除第五个元素
c.insert(pos , elem); //在pos位置插入一个元素elem,并返回新元素的位置
c.insert(pos , n , elem); //在pos位置插入n个元素elem,无返回值
c.insert(pos , beg , end);
c.resize(num); //将容器大小改为num。可更大或更小。
c.resize(num , elem); //将容器大小改为num,新增元素都为 elem
c.clear(); //移除所有元素,将容器清空
PS:Deque和Vector是智能容器,删除或者增加元素时,其他位置与元素会进行相应的移动。
C++ 堆
一般在维护一组数据,每次只取最大值(最小值)而不关心顺序时用到:leetcode merge_k_sort_list
https://www.jianshu.com/p/21bef3fc3030
概念:
最大(小)堆是指在树中,存在一个结点而且该结点有儿子结点,该结点的data域值都不小于(大于)其儿子结点的data域值,并且它是一个完全二叉树(不是满二叉树)。
注意:在多个子树中,并不是说其中一个子树的父结点一定大于另一个子树的儿子结点。最大堆是树结构,而且一定要是完全二叉树。

数据结构:链表或者数组(因为是完全二叉树,一般使用数组)

(1)、父结点为:i / 2(i ≠ 1),若i = 1,则i是根节点。
(2)、左子结点:2i(2i ≤ n), 若不满足则无左子结点。
(3)、右子结点:2i + 1(2i + 1 ≤ n),若不满足则无右子结点。

最大堆的插入:直接插入到尾部,节点上浮调整 O(log(n))
最大堆的删除:只能删除堆顶元素。 O(log(n))
最大堆的创建:

(1)、先创建一个空堆,然后根据元素一个一个去插入结点。由于插入操作的时间复杂度为O(log2(n)),那么n个元素插入进去,总的时间复杂度为O(n * log2(n))。
(2)、将这n个元素先顺序放入一个二叉树中形成一个完全二叉树,然后来调整各个结点的位置来满足最大堆的特性。log2(n)

C++stl:

STL中的建立的队默认是最大堆,要想用最小堆的话,必须要在push_heap,pop_heap,make_heap等每一个函数后面加第三个参数greater(),括号不能省略
make_heap(_First, _Last, _Comp); //默认是建立最大堆的。对int类型,可以在第三个参数传入greater()得到最小堆,也可以传入自定义比较函数。
push_heap (_First, _Last); //在堆中添加数据,要先在容器中加入数据,再调用push_heap ()
pop_heap(_First, _Last); //在堆中删除数据,要先调用pop_heap()再在容器中删除数据(在末尾,例如vector调用pop_back())
sort_heap(_First, _Last); //堆排序,排序之后就不再是一个合法的heap了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值