1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。
2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作: empty:判空操作 back:获取尾部元素操作 push_back:尾部插入元素操作 pop_back:尾部删除元素操作
4. 标准容器vector、deque、list均符合这些需求,默认情况下,如果没有为stack指定特定的底层容器, 默认情况下使用deque。
接口说明
模拟实现代码
#pragma once
#include<iostream>
#include<deque>
#include<vector>
using namespace std;
namespace ST
{
template<class T, class Container = vector<T>>
class stack
{
public:
stack() {}
// 返回指向栈底部第一个元素的迭代器
typename Container::iterator begin()
{
return _con.begin();
}
// 返回指向栈末尾之后一个位置的迭代器
typename Container::iterator end()
{
return _con.end();
}
// 返回常量迭代器,避免修改栈元素
typename Container::const_iterator begin() const
{
return _con.begin();
}
typename Container::const_iterator end() const
{
return _con.end();
}
bool empty() const
{
return _con.empty();
}
size_t size() const
{
return _con.size();
}
T& top()
{
return _con.back();
}
const T& top() const
{
return _con.back();
}
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
private:
Container _con;
};
}
可以看出与一般模拟实现不同的是,并没有手搓各种操作,而是调用增加了一个类模板来调用这个类中的已经写好的成员函数接口来实现栈的后进先出,所以表明栈只是一种模式,其中可以使用其他各种类来实现栈的后进先出模式。
测试代码
#include"mystack.h"
void stack_test()
{
ST::stack<int> st;
st.push(1);
st.push(2);
st.push(3);
auto it = st.begin();
while (it != st.end())
{
cout << *it << ' ';
++it;
}
cout << "测试取栈顶元素"<<endl;
cout << st.top() << endl;
cout << "测试删除栈顶元素" << endl;
st.pop();
for (auto e : st)
{
cout << e << ' ';
}
cout << endl<<"判断栈是否为空" << endl;
cout << st.empty()<<endl;
}
int main()
{
stack_test();
return 0;
}
运行结果