zoukankan      html  css  js  c++  java
  • 面试题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/

    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    注册界面测试案例注意点
    linux常用命令
    linux常用快捷键总结
    2015.8.29某高级企业的在线笔试题
    图像处理------直方图均衡化
    “猫叫系统”开启了观察者模式
    Hua Wei 机试题目四---2014
    Hua Wei 机试题目三---2014
    Hua Wei 机试题目二
    Hua Wei 机试题目一
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12636320.html
Copyright © 2011-2022 走看看