zoukankan      html  css  js  c++  java
  • 剑指Offer:用两个栈实现队列

    剑指Offer:用两个栈实现队列

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

    解题思路:

    1. 通过两个栈实现一个队列,一个存放最终实现队列的数据栈,一个存放临时栈;
    2. 当数据栈中有数据,需要插入一个元素时,先将数据栈全部存放到临时栈,再将数据栈全部弹出,然后插入的数据添加到临时栈;
    3. 这时数据栈空,再将临时栈中所以元素存放到数据栈中,并弹出临时栈所以元素。
    4. 删除队列头部元素,直接弹出数据栈的栈顶元素即可。

    注意:

    1. 当数据栈为空,即栈实现的队列无元素,直接入数据栈,无需其他操作;
    2. 当数据栈空,删除元素失败,返回-1,否则返回删除的元素。
    class CQueue {
    public:
        CQueue() 
        { }
    
        void appendTail(int value) 
        {
            if (!data_stack.empty())
            {   
                while(!data_stack.empty())
                {
                    tmp_stack.push(data_stack.top());
                    data_stack.pop();
                }
                tmp_stack.push(value);
                while(!tmp_stack.empty())
                {
                    data_stack.push(tmp_stack.top());
                    tmp_stack.pop();
                }
            }  
            else 
            {
                data_stack.push(value);
            }
    
            return;
        }
        
        int deleteHead() 
        {
            int i;
            //CQueue();
            if(data_stack.empty())
            {
                return -1;
            }
            i=data_stack.top();
            data_stack.pop();
            return i;
        }
    private:
        stack<int> data_stack;
        stack<int> tmp_stack;
    };
    
    /**
     * Your CQueue object will be instantiated and called as such:
     * CQueue* obj = new CQueue();
     * obj->appendTail(value);
     * int param_2 = obj->deleteHead();
     */
    
  • 相关阅读:
    hdu 1669(二分+多重匹配)
    hdu 2389(最大匹配bfs版)
    hdu 3118(二进制枚举)
    计算机常用端口一览表
    自制EIGRP配置实验大全
    自制EIGRP配置实验大全
    《生成树选举口诀》【转载】
    CCNA基础知识摘录
    对eigrp默认网络的理解!
    对eigrp默认网络的理解!
  • 原文地址:https://www.cnblogs.com/Tavi/p/12514044.html
Copyright © 2011-2022 走看看