初来乍到,望大家点点赞,点点关注,谢谢各位看官老爷
个人主页
在c语言中我们已经模拟实现过栈和队列了,对其底层结构有了基本的认识
栈和队列的详讲
文章目录
目录
文章目录
前言
一、了解栈和队列是什么?
编辑编辑
二、stack模拟实现
1、库函数
2、代码模拟实现
三、queue模拟实现
1、库函数
2、代码实现
四、题目中的应用
1、题目
2、解题思路
3、代码解题
总结
前言
我们本次栈和队列的模拟实现不在想c语言中一样从底层出发,而是运用适配器,将运用我们已经学习过的类和对象、模板、vector和list等来模拟实现。
适配器的解释:电脑的适配器是将220V的电压转化为电脑所能承受的电压,而在c++中的适配器是将我们现学习过的知识通过整理为一个新的类;在C++中,适配器可以用来使不兼容的接口协同工作。适配器是一个类,它将一个现有的类的接口转换成另一个类的接口。
一、了解栈和队列是什么?
在c语言中有着非常详细的讲解
栈和队列的详讲
二、stack模拟实现
1、库函数
在库文件中,stack是用deque来封装,而我们目前没有学,所以用vector来实现。
2、代码模拟实现
template<class T, class Container = vector<T>>
我们的stack是一种容器适配器,而容器适配器就需要拥有容器;在我们学习模板的时候,知道模板参数取决于传递过来的类型是什么,在我们现学的容器中vector和stack底层比较相似,所以我们用了两个模板参数,一个为向栈里将来想要放入的数据类型,第二个模板参数为栈的类型。
template<class T, class Container = vector<T>>
class stack
{
public:
//由于是容器封装的,所以容器的各个函数我们在这里也是可以调用的
void push(const T& x)
{
_con.push_back(x);
}
void pop()
{
_con.pop_back();
}
T& top()
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
private:
// vector<T> _v;
Container _con;//将传递过来的容器封装封装为_con
};
类和对象不仅可以封装内置类型,或者自定义类型,它还可以封装一些容器进去。
三、queue模拟实现
1、库函数
2、代码实现
这里的容器是deque也是没有接触过,所以我们用list代替
template<class T, class Container = list<T>>
class queue
{
public:
void push(const T& x)
{
_con.push_front(x);
}
void pop()
{
_con.pop_back();
}
T& front()
{
return _con.front();
}
T& back()
{
return _con.back();
}
bool empty()
{
return _con.empty();
}
size_t size()
{
return _con.size();
}
private:
Container _con;
};
由于是容器封装的,所以容器的各个函数我们在这里也是可以调用的,前提是这个容器中存在这些函数。
四、题目中的应用
1、题目
最小栈
2、解题思路
我们搭建两个栈,一个存放原始数据,一个存放最小数据
入栈:当存最小数栈为空时,我们就将需要插入的val插入,当val是最小数的时候,我们就再向最小栈插入最小栈的栈顶,也就是最小数。
出栈:两个栈同时出;
栈顶元素我们就用原始数的栈;
最小栈顶就用最小数栈;
3、代码解题
class MinStack {
public:
MinStack() {
}
void push(int val) {
st1.push(val);
if(st2.empty()||val<=st2.top())
{
st2.push(val);
}
else
{
st2.push(st2.top());
}
}
void pop() {
st1.pop();
st2.pop();
}
int top() {
return st1.top();
}
int getMin() {
return st2.top();
}
private:
std::stack<int> st1;//存放常规数据
std::stack<int> st2;//存放最小数
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/