剑指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();
 */
posted @ 2020-02-17 22:12  Ternence_zq  阅读(174)  评论(0编辑  收藏  举报