面试题 7,用两个栈实现队列

原题在P75

思路:一个栈用于进,需要删除时,把所有的元素从一个栈移到另一个栈中,从栈顶删除。因为经过两次进栈,顺序变成了先进的在栈顶,这样可以做到先进先出。

代码:

template <typename T> class CQueue
void CQueue::appendTail(const T& node){
    while(!stack2.empty()){
        stack1.push(stack2.top());
        stack2.pop();
    }
    stack1.push(node);
}

T CQueue::deleteHead(){
    while(!stack1.empty()){
        stack2.push(stack1.top());
        stack1.pop();
    }
    if(stack2.empty)
        printf("%s\n0", "Queue already empty");
    else{
        T node = stack2.top();
        stack2.pop();
        return node;
    }
}

 

和答案对照,思路基本一致。

不同之处在于:

1. 函数的定义返回值类型错误,不是在函数定义前写模板申明,而是直接在函数的返回值上加入template。

2. stack1 和stack2之间的元素移动时,最好使用&引用,这样确保移动的是同一个对象。deleteHead() 返回值由于已经规定是T,不用引用。

3. 栈空时,最好throw 异常,更加专业些。

 

修改后的代码:

template<typename T> void CQueue<T>::appendTail(const T& node){//更改
    while(!stack2.empty()){
        T &data = stack2.top();    //更改
        stack1.push(data);
        stack2.pop();
    }
    stack1.push(node);
}

template<typename T> T CQueue<T>::deleteHead(){
    while(!stack1.empty()){
        T &data = stack1.top();
        stack2.push(data);
        stack1.pop();
    }
    if(stack2.empty)
        throw new std::Exception("Queue already empty");//更改
    else{
        T node = stack2.top();    //更改
        stack2.pop();
        return node;
    }
}

 

 

posted on 2013-11-26 20:46  Felix Fang  阅读(160)  评论(0)    收藏  举报

导航