面试题09:用两个栈实现队列(C++)

题目地址:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/

题目描述

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 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]

解题思路

栈的特性:先进后出  

队列特性:先进先出

双栈实现队列一个栈A只负责入队,另一个栈B只负责出队,入队的时候直接加入队尾就行,即将元素value直接压入输入栈A,而在出队的时候要分情况,根据队列先进先出的特性,在输出栈B为空的时候,将输入栈A的数据全部放入到输出栈B中,这样就相当于将A中的元素逆序输出到B中,在输出栈B不为空的时候,即B中有数据的时候,直接弹出栈顶元素即可,因为B的栈顶元素是A的栈底元素。

疑问:如何用队列实现栈的功能

 队列实现栈:利用队列和栈的特性,我们将数据在队列中以栈的顺序存储好,然后完成栈的相关功能。

程序源码

双栈实现队列

class CQueue {
    stack<int>A; //入队栈
    stack<int>B; //出队栈,即A的逆序输出
    int size = 0; //在出队栈B中操作队列的首部
public:
    CQueue() {

    }
    
    void appendTail(int value) {  //队尾添加元素=在入队栈A中直接压入元素
        A.push(value); 
        size++;
    }
    
    int deleteHead() { //在队头删除元素=在输出栈B中弹出栈顶元素
        if(size == 0) return -1; //输出栈B为空
        if(B.empty() && A.empty()) return -1; //输出栈为空并且输入栈也为空,因为当输出栈B为空时,要从输入栈A中取元素
        if(B.empty() && !A.empty()) //输出栈B为空时,输入栈A不为空,则将输入栈A的元素装入B中,从而实现了A的逆序
        {
            while(!A.empty())
            {
                B.push(A.top());
                A.pop();
            }
        }       
        int head=B.top(); //输出栈B不为空时,直接弹出栈顶元素,即删除队列的头部,也就是输入栈A的栈底元素
        B.pop();
        return head;
    }
};
/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue* obj = new CQueue();
 * obj->appendTail(value);
 * int param_2 = obj->deleteHead();
 */

队列实现栈

class MyStack {
private:
    queue<int> que;
    
public:
    /** Initialize your data structure here. */
    MyStack() {
        
    }
    
    /** Push element x onto stack. */
    void push(int x) {
        que.push(x);
        for (int i=0; i<que.size()-1; ++i){
            que.push(que.front());
            que.pop();
        }
        
    }
    
    /** Removes the element on top of the stack and returns that element. */
    int pop() {
        int res = que.front();
       que.pop();
        return res;
    }
    
    /** Get the top element. */
    int top() {
        return que.front();
    }
    
    /** Returns whether the stack is empty. */
    bool empty() {
        return que.empty();
    }
};

参考文章

https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-3/

https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-2/

猜你喜欢

转载自www.cnblogs.com/wzw0625/p/12636320.html