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

1 篇文章 0 订阅
1 篇文章 0 订阅
本文介绍了如何在C++中使用适配器和已学的类、对象、模板以及vector和list来模拟实现栈和队列,包括栈和队列的基本概念,以及如何在实际问题中应用,如解决最小栈的问题。
摘要由CSDN通过智能技术生成

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

个人主页

 在c语言中我们已经模拟实现过栈和队列了,对其底层结构有了基本的认识

栈和队列的详讲


前言

我们本次栈和队列的模拟实现不在想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();
 */


  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃喵的鲤鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值