[STL]stack和queue模拟实现
文章目录
stack模拟实现
stack是一种容器适配器,标准容器vector、deque、list都可以作为实现stack的底层数据结构,因为它们都具备以下功能:
- empty:判空操作
- back:获取尾部元素操作
- push_back:尾部插入元素操作
- pop_back:尾部删除元素操作
stack会将这些已有的容器进行转化,转换成能够以栈的方式使用的形式,stack的整体结构如下:
c++
template<class T, class Container = vector<T>>
class stack
{
public:
void push(const T& x) {}; //将数据压入栈中
void pop() {}; //将栈顶数据弹出
const T& top() {}; //获取栈顶数据
size_t size() {}; //获取栈的数据个数
bool empty() {}; //判断栈是否为空
private:
Container _con;
};
说明: 由于stack可以由不同的容器实现,模板中的Container用于传入不同种类的容器。
push函数
push函数的功能是将数据压入栈中,只需要使用各个容器都可以使用的尾插函数来模拟实现即可。
c++
void push(const T& x)
{
_con.push_back(x);
}
pop函数
pop函数的功能是将栈顶的数据删除,只需要使用各个容器都可以使用的尾删函数来模拟实现即可。
c++
void pop()
{
_con.pop_back();
}
top函数
top函数的功能是获取栈顶的数据,只需要使用各个容器都可以使用的获取尾部数据的函数来模拟实现即可,然后返回数据的const引用。
c++
const T& top()
{
return _con.back();
}
size函数
size函数的功能是获取栈内数据个数,只需要使用各个容器都可以使用的获取数据个数函数来模拟实现即可。
c++
size_t size()
{
return _con.size();
}
说明: 返回值使用的size_t是无符号整数,是为了兼容不同容器可能会有的有符号整数和无符号整数的区别。
empty函数
empty函数的功能是判断栈是否为空,只需要使用各个容器都可以使用的判断是否为空的函数来模拟实现即可。
c++
bool empty()
{
return _con.empty();
}
stack模拟实现的完整代码
stack模拟实现的完整代码如下:
c++
template<class T, class Container = 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();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
};
queue模拟实现
queue是一种容器适配器,标准容器类deque和list都可以作为实现queue的底层数据结构,因为它们都具备以下功能:
- empty:检测队列是否为空
- size:返回队列中有效元素的个数
- front:返回队头元素的引用
- back:返回队尾元素的引用
- push_back:在队列尾部入队列
- pop_front:在队列头部出队列
queue会将这些已有的容器进行转化,转换成能够以队列的方式使用的形式,queue的整体结构如下:
c++
template<class T, class Container=list<T>>
class queue
{
public:
void push(const T& x); //将数据入队
void pop(); //将栈顶数据出队
const T& front(); //获取队头数据
const T& back(); //获取队尾数据
size_t size(); //获取栈的数据个数
bool empty(); //判断栈是否为空
private:
Container _con;
};
说明: 由于queue可以由不同的容器实现,模板中的Container用于传入不同种类的容器。
push函数
push函数的功能是尾插数据入队,只需要使用各个容器都可以使用的尾插函数来模拟实现即可。
c++
void push(const T& x)
{
_con.push_back(x);
}
pop函数
pop函数的功能是将队头的数据删除,只需要使用各个容器都可以使用的头删函数来模拟实现即可。
c++
void pop()
{
_con.pop_front();
}
front函数
front函数的功能是获取队头的数据,只需要使用各个容器都可以使用的获取头部数据的函数来模拟实现即可,然后返回数据的const引用。
c++
const T& top()
{
return _con.front();
}
back函数
back函数的功能是获取队尾的数据,只需要使用各个容器都可以使用的获取尾部数据的函数来模拟实现即可,然后返回数据的const引用。
c++
const T& top()
{
return _con.back();
}
size函数
size函数的功能是获取队列内数据个数,只需要使用各个容器都可以使用的获取数据个数函数来模拟实现即可。
c++
size_t size()
{
return _con.size();
}
说明: 返回值使用的size_t是无符号整数,是为了兼容不同容器可能会有的有符号整数和无符号整数的区别。
empty函数
empty函数的功能是判断队列是否为空,只需要使用各个容器都可以使用的判断是否为空的函数来模拟实现即可。
c++
bool empty()
{
return _con.empty();
}
queue模拟实现的完整代码
queue模拟实现的完整代码如下:
c++
template<class T, class Container=list<T>>
class queue
{
public:
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_front();
}
const T& front()
{
return _con.front();
}
const T& back()
{
return _con.back();
}
size_t size()
{
return _con.size();
}
bool empty()
{
return _con.empty();
}
private:
Container _con;
};