一、stack的使用
1、接口函数与作用
接口 | 作用 |
---|---|
stack< T > | 构造一个空栈 |
push(val) | 将val压入栈中 |
pop() | 出栈 |
size() | 栈的元素个数 |
top() | 取出栈顶元素的引用 |
empty() | 判断栈是否为空 |
2、使用
void test01()
{
//构造一个空栈
stack<int> sta;
//进栈
sta.push(1);
sta.push(2);
sta.push(3);
sta.push(4);
sta.push(5);
//大小
cout <<"size:"<< sta.size() << endl;
//是否为空
while (!sta.empty())
{
cout << sta.top() << " ";
//出栈
sta.pop();
}
}
二、queue使用
1、接口函数与作用
接口 | 作用 |
---|---|
queue< T > | 构造一个空队列 |
push(val) | val入队 |
pop() | 出队 |
size() | 队列的元素个数 |
front() | 取出队头元素的引用 |
back() | 取出队尾元素的引用 |
empty() | 判断栈是否为空 |
2、使用
void test02()
{
//构造一个空队列
queue<int> q;
//进队
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
//大小
cout << "size:" << q.size() << endl;
//判断是否为空
while (!q.empty())
{
//取队头
cout << q.front() << " ";
//出队
q.pop();
}
}
三、stack、queue的模拟实现
1、容器适配器
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。
2、stack
、queue
就属于容器适配器,stack
、queue
是对deque容器的封装。
如:
我们也可以不使用默认的容器如:
(前提:重新指定的容器要具有相应的接口:头插、尾插、头删、尾删等一些接口)
void test03()
{
stack<int,vector<int>> sta;
sta.push(1);
sta.push(2);
while (!sta.empty())
{
cout << sta.top() << " ";
sta.pop();
}
}
3、deque
容器
deque
容器具有头删尾删,头插尾插等接口且效率还不错,我们下面就模拟栈、队列都使用该容器。
4、stack
的模拟实现
stack
的接口实现都是复用了deque
容器的接口。
//T是数据类型,Con是容器类型,默认使用deque容器
template<class T, class Con = deque<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:
//构造一个deque容器
Con _c;
};
5、queue
的模拟实现
也是复用deque
容器的接口
template<class T, class Con = deque<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:
//构造一个deque容器
Con _c;
};
6、测试
void test_stack()
{
xu::stack<int> sta;
sta.push(1);
sta.push(2);
sta.push(3);
sta.push(4);
cout <<sta.size() << endl;
while (!sta.empty())
{
cout << sta.top() << " ";
sta.pop();
}
cout << endl;
}
void test_queue()
{
xu::queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);
cout << q.size() << endl;
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}