用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

 

示例 1:

输入:
["CQueue","appendTail","deleteHead","deleteHead"]
[[],[3],[],[]]
输出:[null,null,3,-1]
示例 2:

输入:
["CQueue","deleteHead","appendTail","appendTail","deleteHead","deleteHead"]
[[],[],[5],[2],[],[]]
输出:[null,-1,null,null,5,2]
提示:

1 <= values <= 10000
最多会对 appendTail、deleteHead 进行 10000 次调用

 

相关知识复习:

 1.栈中数据先进后出,队列先进先出

 2.C++ stl中栈的相关函数

     1.void push(T a); 

     2. void pop();//弹出栈顶元素 栈空报错

     3.void emplace();

    //与push函数的差异 push函数将值或者参数的副本插入容器,emplace构造一个新的元素加入到容器

    //调用emplace时可以直接传入构造对象所需要的参数 会自动调用其构造函数

   4. T top()//返回栈顶元素 栈空报错

   5._size size()//返回栈中元素个数

   6.empty();

   7.swap  //与某个栈交换值

思路:  

用两个栈模拟队列 一个栈用来插入元素,一个栈用来删除元素

插入元素的时候直接将元素入栈 此时最新加入的元素在栈顶

在删除元素的时候由于是删除队列头部的元素,也就是最先加入的队列的元素

由于第一个栈用来插入元素,那么越早插入的元素越在栈的下面,如果只存在一个栈

来模拟队列,就需要取出栈中所有元素后除去栈底元素,但是借助第二个栈可以在删除时将当前第一个栈中所有的元素都加入的第二个栈中,这样第二个栈中的顺序与队列顺序一致

并且第二个栈中所有元素都在第一个栈中所有元素的前面,我们选择在第二个栈为空并且需要删除元素时选择将第一个栈中元素移到栈二中,而不是在插入的时候,这样可以减少

两个栈转移元素的次数。

在每次删除的时候检查第二个栈中有没有元素,如果没有元素,将第一个栈中的元素逐个pop并push到第二个栈中,此时栈顶元素就是当前的队头元素,并且在第二个栈中所有跟着其加入的元素都在他的下面,也就是说如果第二个栈不为空,那么直接弹出栈顶元素

 

作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm/5d3i87/
来源:力扣(LeetCode)

class CQueue {
public:
     stack<int> in;
     stack<int> out;
    CQueue() {

    }
    
    void appendTail(int value) {
         in.push(value);
    }

    int deleteHead() {
       if(!out.empty()){
           int a=out.top();
           out.pop();
           return a;
       }
       if(in.empty()){
          return -1;
       }
       while(!in.empty()){
           int b=in.top();
           out.push(b);
           in.pop();
       }
       int result=out.top();
       out.pop();
       return result;
    }
};