注意 : 以下所有文档都来源此网站 : http://cplusplus.com/
一、stack 的介绍和使用
stack 文档的介绍:https://cplusplus.com/reference/stack/stack/
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。
2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。
3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作:
① push_back:尾部插入元素操作
② pop_back:尾部删除元素操作
③ back:获取尾部元素操作
④ empty:判空操作
二、stack 接口的介绍
函数说明 | 接口说明 |
stack()
| 构造空的栈 |
empty()
| 检测stack是否为空 |
size()
| 返回stack中元素的个数 |
top()
| 返回栈顶元素的引用 |
push()
| 将元素val压入stack中 |
pop()
| 将stack中尾部的元素弹出 |
三、stack 的模拟实现
从栈的接口中可以看出,栈实际是一种特殊的vector,因此使用vector完全可以模拟实现stack。
下面就来模拟实现一下 stack,还是与以往一样建两个文件
一个负责测试所模拟实现的接口文件(Test.cpp),一个负责实现接口的文件(stack.hpp)
1.下面是负责实现接口的文件 list.hpp 文件的代码:
#pragma once
#include <iostream>
#include <deque>
#include <vector>
#include <list>
using namespace std;
namespace HK
{
// Ĭdeque Ҳʾ
template <class T, class container = deque<T>>
class stack
{
public:
stack()
{}
void push(const T& x)
{
this->_con.push_back(x);
}
void pop()
{
this->_con.pop_back();
}
T& top()
{
return this->_con.back();
}
const T& top() const
{
return this->_con.back();
}
bool empty() const
{
return this->_con.empty();
}
size_t size() const
{
return this->_con.size();
}
private:
// std::vector<T> _c;
container _con;
};
}
2. 下面是负责测试所模拟实现的接口 Test.cpp文件的代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include "stack.hpp"
void Test_stack()
{
//HK::stack<int> s;
//HK::stack<int, vector<int>> s;
HK::stack<int, list<int>> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
cout << endl;
}
int main()
{
Test_stack();
return 0;
}