今天主要说栈stack和queue队列
先说deque,因为vector不能在头部进行操作,所以deque应运而生
deque双端数组 内部有个中控器
void test01(){
deque<int>d1;
//尾插
d1.push_back(10);
d1.push_back(20);
//头插 vector没有
d1.push_front(100);
d1.push_front(200);
printDeque(d1);//200 100 10 20
//尾删
d1.pop_back();
printDeque(d1);
//头删
d1.pop_front();
printDeque(d1);
}
不同点:cout<<d1.capacity();没有这个命令 其他没有不同了
这里加个sort排序和list不同的用法
void test01(){
deque<int> d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_front(100);
d.push_front(200);
d.push_front(300);
printDeque(d);
//排序 对于支持随机访问的容器都可进行sort排序
sort (d.begin(),d.end());
cout<<"排序后"<<endl;
printDeque(d);//实验过了,vector也可
}
list是 L1.sort();//运行成功 默认从小到大
言归正传栈和队列
基本概念
栈不允许有遍历行为 只有栈顶元素才有机会被访问
栈容器符合先进后出栈可以判断容器是否为空吗?可以empty
栈可以返回元素个数吗?可以size
生活中例子 弹匣 坐地铁
queue就是队列
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为.
进数据--入队(push) 出数据--出队(pop)
队尾----back 队头----front
判断队列是否为空empty 大小size
例子: 打饭排队
不允许有遍历,但是可以用其他方法遍历
常用接口
void test01(){
stack<int> s;
//入栈
s.push(10);
s.push(20);
s.push(30);
s.push(40);
cout<<"栈的大小"<<s.size()<<endl;//0
//只要栈不为空,我们就查看栈顶,并且执行出战操作
while(!s.empty()){
//查看栈顶元素
cout<<"栈顶元素为"<<s.top()<<endl;
//出栈
s.pop();
}
cout<<"栈的大小"<<s.size()<<endl;//0
}
用s.empty()和s.top()和s.pop()方式遍历
那我们想如果换成自定义数据类型呢?该如何实现?
自定义Person
class Person//class 自定义数据类型
{
public:
Person(string name,int age)//构造函数 赋初值
{
this->m_Name=name;
this->m_Age=age;//构造函数自动调用执行
}
string m_Name;
int m_Age;
};
void test01(){
//创建队列
queue<Person> q;
//准备数据
Person p1("唐僧",30);//px是对象
Person p2("悟空",1000);
Person p3("八戒",800);
Person p4("沙僧",500);
//入队
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
cout<<"队列大小为:"<<q.size()<<endl;
//判断只要队列不空,查看队头,查看队尾,出队
while(!q.empty()){
//查看队头
cout<<"队头元素----姓名"<<q.front().m_Name<<"年龄"<<q.front().m_Age<<endl;
//查看队尾
cout<<"队尾元素----姓名"<<q.back().m_Name<<"年龄"<<q.back().m_Age<<endl;
//出队
q.pop();//很巧妙
}
cout<<"队列大小为:"<<q.size()<<endl;
}
可以看出,其他一样,都是while循环操作,pop输出
但在头部操作不同,stack是s.top头部元素 queue 为
cout<<"队头元素----姓名"<<q.front().m_Name<<"年龄"<<q.front().m_Age<<endl;
//查看队尾
cout<<"队尾元素----姓名"<<q.back().m_Name<<"年龄"<<q.back().m_Age<<endl;
不要忘记queue还可以查看队尾
重要声明
在C++中的标准库中,std::stack和std::queue是基于其他容器实现的适配器,并且它们不直接提供迭代器功能。因此,不能通过迭代器来访问std::stack和std::queue中的元素。
但是,你可以使用其他容器(例如std::vector或std::deque)作为基础来实现具有迭代器功能的堆栈和队列。例如,你可以使用std::vector来实现一个具有迭代器功能的堆栈,或使用std::deque来实现一个具有迭代器功能的队列。