stack
一、stack介绍
stack是一种容器适配器,专门设计用于后进先出,其中元素仅从容器的一端插入和提取
二、stack接口
函数名称 | 功能说明 |
empty | 判断容器是否为空 |
size | 返回容器容量大小 |
top | 返回栈顶数据 |
push | 从栈顶插入元素 |
pop | 删除栈顶元素 |
三、stack模拟实现
#pragma once
#include<iostream>
#include<vector>
#include<list>
using std::cout;
using std::endl;
namespace mystack
{
// 适配器模式/配接器
template<class T,class Container = std::vector<T>>
//默认为容器栈
//类模板半缺省,默认为数组栈
class stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()
{
return _con.back();
}
bool size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
//通过已有容器适配,从而实现链式栈,数组栈
//vector<T> _v;
};
void test_1()
{
stack<int, std::vector<int>> st1;
st1.push(1);
st1.push(2);
st1.push(3);
st1.push(4);
st1.push(5);
while (!st1.empty())
{
cout << st1.top() << " ";
st1.pop();
}
cout << endl;
}
}
queue
一、queue介绍
queue是一种容器适配器,专门用于在先进先出操作,其中从容器一端插入元素,另一端提取元素
二、queue接口
函数名称 | 功能说明 |
empty | 判断容器是否为空 |
size | 返回容器容量大小 |
top | 返回栈顶数据 |
push | 从栈顶插入元素 |
pop | 删除栈顶元素 |
三、queue模拟实现
#pragma once
#include<iostream>
#include<vector>
#include<list>
using std::cout;
using std::endl;
namespace myqueue
{
// 适配器模式/配接器
template<class T, class Container = std::list<T>>
//默认为链式队列
//类模板半缺省,默认为数组栈
class queue
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()
{
return _con.back();
}
bool size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
};
void test_1()
{
queue<int> q1;//默认为链式队列
q1.push(1);
q1.push(2);
q1.push(3);
q1.push(4);
q1.push(5);
while (!q1.empty())
{
cout << q1.top() << " ";
q1.pop();
}
cout << endl;
}
}
deque
一、deque介绍
Deque(通常发音为“deck”)是double-e nded queue的不规则首字母缩略词
deque是具有动态大小的序列容器,可以在两端(正面或背面)扩展或收缩
允许通过随机访问迭代器直接访问单个元素,并通过根据需要扩展和收缩容器来自动处理存储。
deque相当于是vector+list。但与vector不同在于,deque不能保证将所有的元素保存在连续的存储位置。deque 容器存储数据的空间是由一段一段等长的连续空间构成,各段空间之间并不一定是连续的,可以位于在内存的不同区域
deque容器通过一个数组来存放各个连续空间的首地址,也就是说deque数组中存放的全是指针,指针指向的连续空间用于存储数据,后面将这款连续区域称为buffer
deque会将每一个连续空间存储满之后,才将数据存放置下一个连续空间
一般用于stack与queue的底层数据结构
优点 | 缺点 |
1.相比于vector,扩容代价低。只需要扩容存放指针的数组 2.头插头删,尾插尾删效率高 3.支持随机访问(效率没有vector高) | 1.buffer固定大小,中间插入删除困难,随机访问较易(一般情况是固定大小) 2.buffer不固定大小,中间插入删除较易,随机访问困难 3.优势不像vector与list突出 4.不适合遍历,需要频繁检验是否到达buffer边界 |
二、deque接口
1.容量操作:
函数名称 | 功能说明 |
empty | 检测deque是否为空,是返回true,否则返回false |
size | 返回数组大小 |
2.访问与遍历:
函数名称 | 功能说明 |
begin+end | 返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器 |
rbegin+rend | 返回第一个元素的reverse_iterator,即end位置。返回最后一个元素下一个位置的reverse_iterator,即begin位置 |
front | 返回deque的第一个元素的引用 |
back | 返回deque的最后一个元素的引用 |
3.修改操作:
函数名称 | 接口说明 |
push_front | 在deque首元素钱插入值为val的元素 |
pop_front | 删除deque中的第一个元素 |
push_back | 在deque尾部插入值为val的元素 |
pop_back | 删除deque最后一个元素 |
insert | 在deque position位置中插入值为val的元素 |
erase | 删除deque position位置的元素 |
swap | 交换两个deque中的元素 |
clear | 清空deque中的有效元素 |
STL库中deque实现stack与queue
#include<deque>
#include <list>
namespace my_queue
{
template<class T, class Con = std::deque<T>>
//template<class T, class Con = list<T>>
class queue
{
public:
queue() {}
void push(const T& x) { _c.push_back(x); }
void pop() { _c.pop_front(); }
T& back() { return _c.back(); }
const T& back()const { return _c.back(); }
T& front() { return _c.front(); }
const T& front()const { return _c.front(); }
size_t size()const { return _c.size(); }
bool empty()const { return _c.empty(); }
private:
Con _c;
};
template<class T, class Con = std::deque<T>>
//template<class T, class Con = vector<T>>
//template<class T, class Con = list<T>>
class stack
{
public:
stack() {}
void push(const T& x) { _c.push_back(x); }
void pop() { _c.pop_back(); }
T& top() { return _c.back(); }
const T& top()const { return _c.back(); }
size_t size()const { return _c.size(); }
bool empty()const { return _c.empty(); }
private:
Con _c;
};
}