目录
1.什么是stack
2.容器适配器
3.stack的使用
top
push
pop
4.模拟实现stack
1.什么是stack
empty:判空操作back:获取尾部元素操作push_back:尾部插入元素操作pop_back:尾部删除元素操作
2.容器适配器
容器适配器(Container Adapters)是 C++ 标准库提供的一种数据结构,它们基于现有的容器类型,提供了特定的接口和功能,以便更方便地实现某些特定的数据结构和算法。容器适配器本质上是对底层容器的封装,提供了不同的数据访问方式,使它们适用于特定的用途。
标准库中提供了三种常用的容器适配器:
stack:栈适配器,基于底层容器提供了栈数据结构的操作,如压入(push)、弹出(pop)、查看栈顶元素等。默认底层容器是 deque,但也可以使用其他支持 back() 和 push_back() 操作的容器。
queue:队列适配器,基于底层容器提供了队列数据结构的操作,如入队(push)、出队(pop)、查看队首元素等。默认底层容器是 deque,但也可以使用其他支持 back() 和 push_back() 操作的容器。
priority_queue:优先队列适配器,基于底层容器提供了优先队列数据结构的操作,支持在插入元素时根据优先级进行排序。默认底层容器是 vector,但也可以使用其他支持随机访问和插入操作的容器。
3.stack的使用
这些是C++标准库中stack类的构造函数声明。stack是一个适配器容器,它可以使用不同的底层容器来实现栈的功能。这些构造函数声明提供了不同的方式来创建和初始化stack对象,可以根据需求选择合适的构造函数。
stack的Construct中除了构造函数,其他什么都没有,它连拷贝构造、析构都没有。这个也跟它是容器适配器有关系,因为它的成员都是自定义类型,编译器默认生成的就够用。
stack是容器适配器以后,就开始不支持迭代器了。容器支持迭代器,容器适配器不支持迭代器。
栈随便去遍历反而是不好的,因为要保证后进先出的性质。
所以取数据得用top,想取下一个数据就得先pop。
top
reference top(); 和 const_reference top() const; 是 C++ 标准库中 std::stack 类的成员函数之一。它们用于获取栈顶元素的引用。
reference top();:返回栈顶元素的引用。如果需要修改栈顶元素,可以使用这个版本。
#include <iostream>
#include <stack>
stack<int> m;
m.push(42);
m.push(15);
// 使用 top() 获取栈顶元素
int topElement = m.top();
cout << "Top element: " << topElement << endl;
// 修改栈顶元素
m.top() = 99;
cout << "New top element: " << m.top() << endl;
return 0;
}
后进先出,15先出,然后修改为99,最后出99
push
是 C++ 标准库中 std::stack
类的成员函数之一。它们用于将一个新的元素压入栈中。
#include<iostream>
#include<stack>
using namespace std;
int main()
{
stack<int> m;
m.push(10); // 使用右值,将 10 压入栈中
m.push(19);
int newElement = 99;
m.push(newElement); // 使用常量引用,将 newElement 压入栈中
cout << "Stack size: " << m.size() << endl;
while (!m.empty()) // 遍历不能用迭代器,容器适配器不支持迭代器
{
cout << m.top() << " "; // 输出栈顶元素
m.pop(); // 弹出栈顶元素
}
return 0;
}
pop
void pop();
是 C++ 标准库中 stack
类的成员函数之一。它用于将栈顶元素弹出(删除)。
这个函数没有返回值,它只是从栈中移除栈顶元素。在调用 pop()
函数之前,需要确保栈不为空,否则会导致未定义行为。
int main()
{
stack<int> m;
m.push(10); // 使用右值,将 10 压入栈中
m.push(19);
m.push(29);
cout << "Stack size: " << m.size() << endl;
m.pop();
cout << "Stack new size: " << m.size() << endl;
return 0;
}
4.模拟实现stack
STL(标准模板库)中的 stack 和 queue 默认使用 std::deque 作为底层容器的原因是出于性能和功能的考虑。
std::deque(双端队列)是一个双向开口的动态数组,支持在队首和队尾进行高效的插入和删除操作。它的内部实现使得在队首和队尾的操作都能达到接近常数时间复杂度,这使得 std::deque 在作为底层容器时能够提供较好的性能
实现代码
#pragma once
#include "string.h"
#include<iostream>
#include<stack>
#include<deque>
using namespace std;
namespace lty
{
//适配器模式
template<class T, class Container=deque<T>>
class stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()
{
return _con.back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
};
void test_stack()
{
stack<int, deque<int>> st;
st.push(1);
st.push(2);
st.push(3);
st.push(4);
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
cout << endl;
}
}
测试代码
#include "string.h"
int main()
{
lty:: test_stack();
}
结果
头文件包含:代码首先包含了头文件 <deque>,这是为了使用底层容器 std::deque。
命名空间定义:代码将 stack 类放置在了命名空间 lty下,这是为了避免命名冲突和提供代码的组织结构。
stack 类模板定义:stack 类是一个模板类,有两个模板参数:T 表示栈中存储的元素类型,Container 表示底层容器的类型,默认为 std::deque<T>。
公共成员函数:
push(const T& x):将传入的元素值 x 添加到底层容器的末尾,实现了入栈操作。
pop():从底层容器的末尾删除一个元素,实现了出栈操作。
T& top() 和 const T& top() const:分别返回底层容器的末尾元素的引用(允许修改)和常量引用(只读),实现了查看栈顶元素操作。
bool empty() const:返回底层容器是否为空。
size_t size() const:返回底层容器中元素的数量。
私有成员变量 _con:这是一个模板类的私有成员变量,用于存储实际的栈元素。其类型是根据模板参数 Container 确定的,在实例化时会被替换为具体的容器类型。