简介
使用适配器时,必须包含相关的头文件:
- #include< stack >
#include< queue >
stack 适配器所关联的基础容器可以是任意一种顺序容器类型,因此,stack栈可以建立在vector、list或者deque容器之上。
queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list容器上,而不能建立在vector容器上(vector容器增删元素不方便 9.5节)。
priority_queue 适配器要求提供随机访问功能,因此可以建立在vector或deque容器上,但不能建立在list容器上。
默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。
参照—–9.5 容器的区别
==================================================================================================================================================
一、适配器
除了顺序容器外,标准库还提供了三种顺序容器适配器:queue、priority_queue、stack。
适配器是标准库通用概念,包括容器适配器、迭代适配器和函数适配器
本质上,迭代器是使一事物的行为类似于另一事物的行为的一种机制。容器适配器让一种已经存在的容器类型采用另一种不同的抽象类型的工作方式表现。例如,stack栈适配器可使任何一种顺序容器以栈的方式工作
- 使用适配器时,必须包含相关的头文件:
#include< stack >
#include< queue >
1. 适配器的初始化
- 所有的适配器都定义了两个构造函数:默认构造函数用于创建空对象,而带一个容器参数的构造函数将参数容器的副本作为其基础值。
stack<int> stk(deq);//用deq初始化一个新的栈。deq是deque<int>类型的容器
2. 覆盖基础容器类型
默认的stack和queue都基于deque容器实现,而priority_queue则在vector容器上实现。
在创建适配器时,通过将一个顺序容器指定为适配器的第二个类型实参,可覆盖其关联的基础容器类型:
stack<string,vector<string>> str_stk;
stack<string,vector<string>> str_stk2(svec);
3.不同的适配器关联不同的容器
对于给定的适配器,其关联的容器必须满足一定的约束条件。
stack 适配器所关联的基础容器可以是任意一种顺序容器类型,因此,stack栈可以建立在vector、list或者deque容器之上。
queue适配器要求其关联的基础容器必须提供push_front运算,因此只能建立在list容器上,而不能建立在vector容器上(vector容器增删元素不方便 9.5节)。
priority_queue 适配器要求提供随机访问功能,因此可以建立在vector或deque容器上,但不能建立在list容器上。
4.适配器的关系运算
两个相同类型的适配器可以做相等、不等、小于大于等于以及大于等于关系比较,只要基础元素类型支持等于和小于操作符即可。
- 这些关系运算由元素依次比较来实现,第一对不相等的元素将决定两者之间的小于或大于关系。
二、栈适配器
const stack<int>::size_type stk_size = 10;
stack<int> intStack;//空栈
int ix=0;
while(intStack.size()!=stk_size)//在该栈中添加了stk_size个元素
intStack.push(ix++);//0--9//因为默认的栈适配器都是建立在deque容器上,因此采用deque提供的操作来实现栈功能。这个操作通过调研push_back操作实现,
int errot_cnt=0;
while(intStack.empty()==false) //检测栈顶的元素值,然后栈顶元素出栈
{
int value = intStack.top();
if(value!=--ix){
cerr<<"oops! expected"<<ix
<<"received"<<value<<endl;
++error_cnt;
}
intStack.pop();//删除栈顶元素
}
cout<<"our program ran with"
<<error_cnt<<"errors!"<<endl;
二、队列queue和优先级队列priority_queue
标准库队列使用了先进先出的存储和检索策略。
进入队列的对象被放置在尾部, 下一个被取出的元素则取自队列的首部
队列有两种风格:FIFO队列(queue),优先级队列(priority_queue)
priority_queue允许用户为队列中存储的元素设置优先级,这种队列不是直接将新元素放置在队列尾部,而是放在比它优先级低的元素前面。
* 标准库默认使用元素类型的 < 操作符来确定他们之间的优先级 *
要使用两种队列,必须包含queue头文件
//习题 9.43 这道题和数据结构里某道题很类似,括弧匹配
#include <iostream>
#include<string>
#include<cstring>
#include<stack>
using namespace std;
int main()
{
stack<char> sexp;
string exp;
cin>>exp;
string::iterator iter =exp.begin();
while(iter!=exp.end()){
if(*iter!=')')
sexp.push(*iter);
else
{//读到的字符是右圆括号,弹出元素,直到栈顶为左括号或栈为空
while (sexp.top() !='(' && !sexp.empty())
sexp.pop();//删除栈顶元素
if(sexp.empty())
cout<<"efrfrtgg"<endl;
else//栈顶为左圆括号
{
sexp.pop();//删除栈顶元素
sexp.push('@');
}
}
++iter;
}
return 0;
}
本文介绍了栈、队列和优先级队列的基本概念、使用方法及其实现细节,详细解释了如何通过适配器技术调整不同容器类型以满足特定需求。同时,通过实例演示了栈的操作、队列的先进先出特性以及优先级队列的优先级排序机制。
1583

被折叠的 条评论
为什么被折叠?



