• 两个栈实现一个队列


    1、栈和队列介绍
    栈的特点:栈的特点是先进后出,进出元素都是在同一端(栈顶)。

    • 入栈:
      在这里插入图片描述
    • 出栈: 在这里插入图片描述
      队列的特点: 队列的特点是先进先出,出入元素是在不同的两端(队头和队尾)
    • 入队:
      在这里插入图片描述
    • 出队:
      在这里插入图片描述

    2、两个栈实现队原理

    • 我们拥有两个栈,可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老的元素。
      在这里插入图片描述
    • 队列的主要操作无非有两个:入队和出队。在模拟入队操作时,每一个新元素都被压入到栈A当中。
    • 让元素1“入队”:
      在这里插入图片描述
    • 让元素2“入队”:
      在这里插入图片描述
    • 让元素3“入队”:
      在这里插入图片描述
      这时候,我们希望最先“入队”的元素1“出队”,需要怎么做呢?
    • 让栈A中的所有元素按顺序出栈,再按照出栈顺序压入栈B。这样一来,元素从栈A弹出并压入栈B的顺序是3,2,1,和当初进入栈A的顺序1,2,3是相反的:
      在这里插入图片描述
    • 此时让元素1“出队”,也就是让元素1从栈B弹出:
      在这里插入图片描述
    • 让元素2“出队”:
      在这里插入图片描述
      如果这个时候又想做入队操作了呢?当有新元素入队时,重新把新元素压入栈A。
    • 让元素4“入队”:
      在这里插入图片描述此时的出队操作仍然从栈B弹出元素。
    • 让元素3“出队”:
      在这里插入图片描述
    • 这个时候栈B已经空了,如果再想出队怎么办呢?只要栈A还有元素就像刚才一样,把栈A元素弹出并压入栈B。
      在这里插入图片描述
    • 让元素4“出队”:
      在这里插入图片描述

    总结
    在这里插入图片描述

    #include 
    #include 
    using namespace std;
    
    class QUEUE {
    private:
    	stack<int> A, B;
    public:
    	QUEUE() {
    		while (!A.empty())
    			A.pop();
    		while (!B.empty())
    			B.pop();
    	}
    	void que_push(int val)
    	{
    		A.push(val);
    	}
    	int que_pop()
    	{
    		if (B.empty())
    		{
    			while (!A.empty())
    			{
    				B.push(A.top());
    				A.pop();
    			}
    		}
    		if (B.empty())
    			return -1;//error
    		else{
    			int del_value = B.top();
    			B.pop();
    			return del_value;
    		}
    	}
    };
    int main(void)
    {
    	stack<int> sta1; QUEUE Que1;
    	Que1.que_push(1);
    	Que1.que_push(2);
    	Que1.que_push(3);//-> 1 2 3 ->
    	cout << "弹出的是头" << Que1.que_pop() << endl;//3
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 上述的stack用的c++的栈容器(但是栈的底层是由链表实现的)

    如果你精力旺盛可以尝试实现一下栈的底层

    插图参考链接:https://blog.csdn.net/ailunlee/article/details/85100514

  • 相关阅读:
    【Mysql】mysql | sql优化 | 优化using filesort
    VMware虚拟机部署Linux Ubuntu系统的方法
    【Java-webflux】Spring5新特性之webflux反应式编程-Project Reactor
    springMVC 拦截器和异常处理器
    java计算机毕业设计二手车交易平台源码+mysql数据库+系统+lw文档+部署
    小程序路由传参的方法?
    【洛谷算法题】P5712-Apples【入门2分支结构】
    一文读懂vue3和vue2的API风格对比
    1032 Sharing
    【JAVAEE基础学习】--文件上传&下载案例-1.0
  • 原文地址:https://blog.csdn.net/weixin_47397155/article/details/126493737