C++——STL标准模板库——容器详解——stack+queue

一、基本概念

(一)stack(栈或堆栈)

一种只允许同一端进出的线性数据结构,数据先进后出。基本模型类似于瓶子。

(二)queue(队列) 

一种只允许一端进、另一端出的线性数据结构,数据先进先出。基本模型类似于管道。

二、构造函数

(一)stack构造函数

stack<T>::stack();                                        默认构造函数

stack<T>::stack(initializer _list);                  初始化列表构造

stack<T>::stack(deque<T>&d);                   双端队列构造

stack<T>::stack(deque<T>&&d);                双端队列移动构造

stack<T>::stack(stack<T>&s);                    复制构造

stack<T>::stack(stack<T>&&s);                  移动构造

stack<T,TypeContainer<T>>::stack(TypeContainer&c);        利用基础容器构造堆栈

(二)queue构造函数

queue<T>::queue();                                     默认构造函数

queue<T>::queue(initializer_list);                初始化列表构造

queue<T>::queue(deque<T>&d);                双端队列构造

queue<T>::queue(deque<T>&&d);             双端队列移动构造

queue<T>::queue(queue<T>&q);                复制构造

queue<T>::queue(queue<T>&&q);              移动构造

queue<T,TypeContainer<T>>::queue(TypeContainer&c);        利用基础容器构造队列

三、成员函数

栈和队列的成员函数基本相同,但栈只能访问栈顶元素,队列能访问队头元素还能访问队尾元素,同时,两种容器均自动管理内存,无容量限制;均不允许遍历操作。

1、emplace(T);                在栈顶或者队尾构造元素,避免复制或者移动等操作影响性能

2、empty();                      判断栈或者队列是否为空

3、pop();                          从栈顶出栈或者从队头出队

4、push(T);                      从栈顶入栈或者从队尾入队

5、size();                         返回栈或者队列内元素数量

6、swap();                       交换堆栈或者交换队列

7、stack<T>::top();          访问栈顶元素,返回引用

     queue<T>::front();       访问队头元素,返回引用

     queue<T>::back();       访问队尾元素,返回引用

8、_Get_container();        vs中提供此函数,返回栈或者队列内部基础容器的引用

四、主要用途

(一)stack主要用途

1、函数调用:在程序执行过程中,函数调用通常被存储在堆栈上。这包括函数的参数、局部变量以及返回地址。当函数被调用时,这些信息被推入堆栈;当函数执行完毕时,这些信息被从堆栈中弹出。

2、表达式计算和语句执行:在编译器中,堆栈被用来实现表达式的计算和语句的执行。例如,括号匹配、后缀表达式(逆波兰表示法)等都利用了堆栈。例如计算器的核心实现就是利用堆栈将中缀表达式转换为后缀表达式进行计算,此功能在我另一篇文章中利用链表具体实现——http://t.csdnimg.cn/JBaZ8

3、 图的深度优先搜索:DFS算法

4、递归

5、安全和加密:在某些加密算法中,堆栈被用来存储中间结果或临时数据,以确保这些数据不会被意外修改或泄露。

6、解析和编译:在编译器设计中,堆栈被用来存储语法树的一部分或用于回溯算法,以确保正确的语法分析。

7、操作系统:进程切换和系统调用处理通常使用堆栈存储和恢复状态信息。

(二)queue主要用途

1、多线程编程中的任务调度:在多线程编程中,Queue可以用来在不同的线程之间传递任务或消息。这有助于实现线程间的协作和通信,并确保任务的顺序执行。

2、数据流处理:在数据流处理中,Queue常常用作缓冲区,存储从数据源获取的数据项。通过将数据项放入队列,可以对其进行进一步的处理或分析。

3、事件驱动的系统:在事件驱动的系统中,Queue用于存储和处理事件。事件可以按照它们发生的顺序放入队列,然后由系统按照先进先出的原则逐个处理。

4、广度优先搜索(BFS):Queue在实现广度优先搜索算法时起到关键作用。通过将节点按顺序放入队列,算法能够按照层级顺序访问节点,首先访问离起始节点最近的节点。

5、任务调度和作业排队:在操作系统或大型系统中,Queue用于任务调度和作业排队。系统将任务放入队列,并根据优先级、到达时间等因素进行排序,然后按照队列的顺序执行任务。

6、消息中间件:在分布式系统中,Queue作为消息中间件的角色出现。生产者将消息放入队列,消费者从队列中获取消息进行处理。这种方式确保了消息的有序传递和处理的可靠性。

7、缓存机制:Queue可以作为缓存机制的一部分,用于存储最近使用或最可能需要的元素。当需要这些元素时,它们可以直接从队列中获取,而无需重新计算或从原始数据源获取。

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用STL模板中的stack数据结构来实现括号匹配。 具体实现方法如下: 1. 遍历字符串中的每个字符。 2. 如果当前字符是左括号(如'('、'{'、'['等),则将其压入栈中。 3. 如果当前字符是右括号(如')'、'}'、']'等),则弹出栈顶元素,判断是否与当前右括号匹配。如果匹配,则继续遍历下一个字符;如果不匹配,则说明括号不匹配,返回false。 4. 如果遍历完字符串后,栈为空,则说明括号匹配;否则,说明括号不匹配,返回false。 下面是一个示例代码: ```c++ #include <iostream> #include <stack> #include <string> using namespace std; bool isMatched(string str) { stack<char> s; for (int i = ; i < str.length(); i++) { char c = str[i]; if (c == '(' || c == '{' || c == '[') { s.push(c); } else if (c == ')' || c == '}' || c == ']') { if (s.empty()) { return false; } char top = s.top(); s.pop(); if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) { return false; } } } return s.empty(); } int main() { string str = "{[()]}"; if (isMatched(str)) { cout << "括号匹配" << endl; } else { cout << "括号不匹配" << endl; } return ; } ``` 在上面的代码中,我们使用了STL模板中的stack数据结构来实现括号匹配。具体来说,我们定义了一个名为s的stack<char>类型的栈,用于存储左括号。在遍历字符串时,如果遇到左括号,则将其压入栈中;如果遇到右括号,则弹出栈顶元素,判断是否与当前右括号匹配。如果匹配,则继续遍历下一个字符;如果不匹配,则说明括号不匹配,返回false。最后,如果遍历完字符串后,栈为空,则说明括号匹配;否则,说明括号不匹配,返回false。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值