初来乍到,望大家点点赞,点点关注,谢谢各位看官老爷
个人主页
在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();*/