目录
概述
stack与queue由严格的插入删除规则,stack元素只能先进后出,而queue元素只能先进先出,stack和queue都支持随机访问。
STL之中,stack和queue都可以通过双端队列deque适配器实现,大大简化了代码。
deque与vector类似,都采用动态内存管理,提供随机存取,并且与vector有着一样的接口,但是deque支持首位两端快速进行插入删除功能。
算法设计:通过类模板,在构造stack/queue时,在stack/queue内部默认构造一个deque,通过调用deque的接口实现stack/queue的功能。
源码
Stack.h
#pragma once
#include <deque>
template<class T, class Container = std::deque<int>>
class Stack
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
const T& top()const
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
private:
Container _con;
};
Queue.h
#pragma once
#include <deque>
template<class T, class Container = std::deque<int>>
class Queue
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
const T& front()
{
return _con.front();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
private:
Container _con;
};
test.cpp
#include "Stack.h"
#include "Queue.h"
#include <iostream>
void test_stack()
{
Stack<int> s;
s.push(1);
s.push(2);
s.push(3);
s.push(4);
while (!s.empty())
{
std::cout << s.top() << " ";
s.pop();
}
std::cout << std::endl;
}
void test_queue()
{
Queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
while (!q.empty())
{
std::cout << q.front() << " ";
q.pop();
}
std::cout << std::endl;
}
int main()
{
test_stack();
test_queue();
return 0;
}