c++详解栈和队列——及模拟实现stack——queue——例题

初来乍到,望大家点点赞,点点关注,谢谢各位看官老爷

个人主页

 在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();
 */


上一篇:LT2611UX四端口 LVDS转 HDMI2.0,带音频-描述


下一篇:小程序变更主体还要重新备案吗?