面试题9:用两个栈实现队列

一.题目

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTaildeleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。

二.思路

使用两个栈stack1和stack2,若添加元素则直接压入栈stack1中;若删除元素,则要分情况:

  1. 如果栈stack2为空,则把栈stack1中的元素弹出压入栈stack2中,此时从栈stack2中弹出数据的顺序符合队列的特点(先进先出)
  2. 如果栈stack2非空,则直接弹出栈stack2顶部元素即可

三.代码

template<typename T> class CQueue{
public:

    CQueue(void);
    ~CQueue(void);

    void appendTail(const T& node);
    T deleteHead();
private:
    stack<T> stack1;
    stack<T> stack2;

};

template<typename T>void CQueue<T>::appendTail(const T& element){
    stack.push(element);
}

template<typename T> T CQueue<T>::deleteHead(){
    
    if(stack2.size() <= 0){
        while(stack1.size() > 0){
            T& data = stack1.top();
            stack1.pop();
            stack2.push(data);
        }

    }

    if(stack2.size() == 0)
        throw new exception("queue is empty.");

    T head = stack2.top();
    stack2.pop();

    return head;    
}

四.本题考点

  1. 考查应聘者对栈和队列的理解
  2. 考查应聘者写与模板相关的代码的能力
  3. 考查应聘者分析复杂问题的能力。应聘者能否通过具体的例子分析问题,通过画图的手段把抽象的问题具体化,从而解决这个相对复杂的问题,是能否顺利通过面试的关键。
原文地址:https://www.cnblogs.com/ovs98/p/9876260.html