目录
一、 stack容器
1.1 stack 基本概念
概念:stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口
注意栈顶在最下边,栈底在最上边
栈中只有顶端的元素才可以被外界使用,因此栈不允许有遍历行为
栈中进入数据称为 — 入栈 push
栈中弹出数据称为 — 出栈 pop
1.2 stack 常用接口
功能描述:栈容器常用的对外接口
构造函数:
stack<T> stk;
//stack采用模板类实现, stack对象的默认构造形式stack(const stack &stk);
//拷贝构造函数
赋值操作:
stack& operator=(const stack &stk);
//重载等号操作符
数据存取:
push(elem);
//向栈顶添加元素pop();
//从栈顶移除第一个元素top();
//返回栈顶元素
大小操作:
empty();
//判断堆栈是否为空size();
//返回栈的大小
注意:栈无法遍历,想要查看栈中元素只能从栈顶看起,然后慢慢弹栈,一个个地查看栈顶元素
stack<int> s;
for (int i = 0; i < 5; i++) {
s.push(i);
}
// 特别注意:查看栈容器里面的数据与其他容器不一样
// 因为栈是后进先出的
// 只要栈不为空,查看栈顶,并且执行出栈操作
while (!s.empty()) {
//输出栈顶元素
cout << "栈顶元素为: " << s.top() << endl;
//弹出栈顶元素
s.pop();
}
综合:
#include<iostream>
using namespace std;
#include<stack>
// 栈容器的特点:先进后出
void test01() {
stack<int> s;
for (int i = 0; i < 5; i++) {
s.push(i);
}
if (s.empty() == 1) {
cout << "此时栈为空" << endl;
}
else {
cout << "此时栈不为空" << endl;
}
cout << endl << "此时栈的大小:" << s.size() << endl << endl;
// 特别注意:查看栈容器里面的数据与其他容器不一样
// 因为栈是后进先出的
// 只要栈不为空,查看栈顶,并且执行出栈操作
/*while (!s.empty()) {
//输出栈顶元素
cout << "栈顶元素为: " << s.top() << endl;
//弹出栈顶元素
s.pop();
}*/
// 也可用for循环代替while循环
for(;s.empty()!=1; )
{
//输出栈顶元素
cout << "栈顶元素为: " << s.top() << endl;
//弹出栈顶元素
s.pop();
}
cout << endl << "此时栈的大小:" << s.size() << endl;
}
int main() {
test01();
cin.get();
return 0;
}
总结:
- 入栈 — push
- 出栈 — pop
- 返回栈顶 — top
- 判断栈是否为空 — empty
- 返回栈大小 — size
二、 queue容器
2.1 queue基本概念
概念:Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口
队列容器允许从一端新增元素,从另一端移除元素。
队尾入队,队头出队。
队列中只有队头和队尾才可以被外界使用,因此队列不允许有遍历行为
队列中进数据称为 — 入队 push
队列中出数据称为 — 出队 pop
2.2 queue 常用接口
功能描述:栈容器常用的对外接口
构造函数:
queue<T> que;
//queue采用模板类实现,queue对象的默认构造形式queue(const queue &que);
//拷贝构造函数
赋值操作:
queue& operator=(const queue &que);
//重载等号操作符
数据存取:
push(elem);
//往队尾添加元素pop();
//从队头移除第一个元素back();
//返回最后一个元素front();
//返回第一个元素
大小操作:
empty();
//判断堆栈是否为空size();
//返回栈的大小
注意:队列无法遍历,想要查看里面的元素得从队头开始,一个个出队然后查看出队的元素。
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;
综合:
#include<iostream>
using namespace std;
#include<queue>
class Person {
public:
Person(string name,int age):m_name(name),m_age(age){}
string m_name;
int m_age;
};
void test01() {
queue<Person> q;
Person p1("A", 15);
Person p2("B", 25);
Person p3("C", 35);
Person p4("D", 45);
q.push(p1);
q.push(p2);
q.push(p3);
q.push(p4);
cout << "队列的大小为:" << q.size() << endl;
// 用for循环代替while循环
for (; q.empty() != 1;) {
cout << "对头元素的姓名为:" << q.front().m_name << endl
<< "对头元素的年龄为:" << q.front().m_age << endl ;
cout << "出队成功!" << endl << endl;
q.pop();
}
cout << "队列的大小为:" << q.size();
}
int main() {
test01();
system("pause");
return 0;
}
总结:
- 入队 — push
- 出队 — pop
- 返回队头元素 — front
- 返回队尾元素 — back
- 判断队是否为空 — empty
- 返回队列大小 — size