stack概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口
栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
与queue相似,stack也是一个适配器类,它给底层vector提供了典型的栈接口。stack比vector的限制多,不允许随机访问栈元素,不能够允许遍历栈,只是把使用限制在栈的基本操作。既可以将压入栈顶,从栈顶弹出元素、查看栈顶的数值、检查元素数目和测试是否为空。栈为先进先出。
stack 常用接口:
构造函数:
stack<T > stk; //stack采用模板类实现, stack对象的默认构造形式
stack(const stack& stk); //拷贝构造函数
赋值操作:
stack& operator=(const stack& stk); //重载等号操作符
数据存取:
push(elem); //向栈顶添加元素
pop(); //从栈顶移除第一个元素
top(); //返回栈顶元素
大小操作:
empty(); //判断堆栈是否为空
size(); //返回栈的大小
示例:
#include<iostream>
using namespace std;
#include <stack>
//栈容器常用接口
void test01()
{
//创建栈容器 栈容器必须符合先进后出
stack<int> s;
//向栈中添加元素,叫做 压栈 入栈
s.push(1);
s.push(2);
s.push(3);
cout << "栈的大小为:" << s.size() << endl;
while (!s.empty())//如果stack中还有元素,那么就继续输出栈顶元素
{
//输出栈顶元素
cout << "栈顶元素为: " << s.top() << endl;
//弹出栈顶元素
s.pop();
}
cout << "栈的大小为:" << s.size() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
运行结果:
queue概念:queue 容器适配器有 2 个开口,其中一个开口专门用来输入数据,另一个专门用来输出数据
queue类是一个适配器类。queue模板让底层类(默认为deque)展示为典型的队列接口。queue的限制比deque更多。不仅不支持随机访问,甚至不允许遍历队列。他只能将元素添加到队尾、从队首删除元素、查看队尾和队首的数值、检查元素数目和测试队列是否为空。(这就是阉割版的deque,但是用在纯队列中效率更高)
queue常用接口:
构造函数:
queue<T > que; //queue采用模板类实现,queue对象的默认构造形式
queue(const queue & que); //拷贝构造函数
赋值操作:
queue& operator=(const queue & que); //重载等号操作符
数据存取:
push(elem); //往队尾添加元素
pop(); //从队头移除第一个元素
back(); //返回最后一个元素
front(); //返回第一个元素
大小操作:
empty(); //判断堆栈是否为空
size(); //返回栈的大小
示例:
#include<iostream>
using namespace std;
#include<queue>
#include<string>
class Person
{
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);
Person p2("孙悟空", 1000);
Person p3("猪八戒", 900);
Person p4("沙僧", 800);
//向队列中添加元素 入队操作
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
//队列不提供迭代器,更不支持随机访问
while (!q.empty()) {
//输出队头元素
cout << "队头元素-- 姓名: " << q.front().m_Name
<< " 年龄: " << q.front().m_Age << endl;
cout << "队尾元素-- 姓名: " << q.back().m_Name
<< " 年龄: " << q.back().m_Age << endl;
cout << endl;
//弹出队头元素
q.pop();
}
cout << "队列大小为:" << q.size() << endl;
}
int main() {
test01();
system("pause");
return 0;
}
运行结果:
stack和queue的使用场景
栈
借助栈的先进后出的特性,可以简单实现一个逆序输出的功能,首先把所有元素依次入栈,然后把所有元素出栈并输出
包括编译器的在对输入的语法进行分析的时候,例如"()"、"{}"、"[]"这些成对出现的符号,借助栈的特性,凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错
包括函数调用和递归的时候,每调用一个函数,底层都会进行入栈操作,出栈则返回函数的返回值
生活中的例子,可以把乒乓球盒比喻成一个堆栈,球一个一个放进去(入栈),最先放进去的要等其后面的全部拿出来后才能出来(出栈),这种就是典型的先进后出模型
队列
当我们需要按照一定的顺序来处理数据,而该数据的数据量在不断地变化的时候,则需要队列来帮助解题
队列的使用广泛应用在广度优先搜索中,例如层次遍历一个二叉树的节点值
生活中的例子,排队买票,排在队头的永远先处理,后面的必须等到前面的全部处理完毕再进行处理,这也是典型的先进先出模型