zoukankan      html  css  js  c++  java
  • 剑指offer--面试题7

    
    
    //两个栈实现一个队列
    
    #include<stack>   //STL
    #include<iostream>
    
    using namespace std;
    
    template<class T>
    class CQueue
    {
        public:
            CQueue();
            ~CQueue();
    
            void appendTail(const T& node);
            T deleteHead();
        private:
            stack<T> stack1;
            stack<T> stack2;
    };
    
    //思路:一个栈做添加队尾元素用;另一个做删除队首元素用。
    //      操作时,对应栈有数据,另一个为空。
    
    template<class T>
    CQueue<T>::CQueue()
    {
    }
    
    template<class T>
    CQueue<T>::~CQueue()
    {
    }
    //stack1作为添加队尾元素的栈
    template<class T>
    void CQueue<T>::appendTail(const T& node)
    {
        if(stack1.empty())
        {
            while(!stack2.empty())
            {
                T temp = stack2.top();
                stack1.push(temp);
                stack2.pop();
            }
            stack1.push(node);
        }
        else
            stack1.push(node);
    }
    
    //stack2作为删除队首元素的栈
    template<class T>
    T CQueue<T>::deleteHead()
    {
        T Head;
        if(stack2.empty())
        {
            if(stack1.empty())
            {
                cerr<<"This Queue is already empty!"
                    <<"Have no to be deleted!"<<endl;
                    exit(1);
            }
            while(!stack1.empty())
            {
                T temp = stack1.top();
                stack2.push(temp);
                stack1.pop();
            }
            Head = stack2.top();
            stack2.pop();
        }
        else
        {
            Head = stack2.top();
            stack2.pop();
        }
    
        return Head;
    }
    
    
    int main(int argc, char* argv[])
    {
        CQueue<char> q1;
        q1.appendTail('a');
        q1.appendTail('b');
        q1.appendTail('c');
        q1.appendTail('d');
        q1.appendTail('e');
    
        char Head = q1.deleteHead();
        cout<<Head<<endl;
        Head = q1.deleteHead();
        cout<<Head<<endl;
    
        q1.appendTail('f');
        q1.appendTail('g');
        Head = q1.deleteHead();
        cout<<Head<<endl;
        Head = q1.deleteHead();
        cout<<Head<<endl;
        Head = q1.deleteHead();
        cout<<Head<<endl;
        Head = q1.deleteHead();
        cout<<Head<<endl;
        return 0;
    }
    
    

    自己所做如上所示。思路就是:一个做删除栈;一个做添加栈。

     

     相比较于作者的思想,虽然大体一致,但自己的思想有多余的部分:

    在添加元素的时候,无论stack1是否为空,作者采取的策略为直接入栈,而自己却是先将stack2中的元素再弹出压入stack1,这一步根本就是多余的!

    作者代码如下:(自己默写)

    //作者代码,更简洁!
    //stack1做入队操作,直接入队
    template<typename T>
    void CQueue<T>::appendTail(const T& node)
    {
        stack1.push(node);
    }
    
    //stack2做出队操作
    template<typename T>
    T CQueue<T>::deleteHead()
    {
        if(stack2.empty())
        {
            while(stack1.empty())
            {
                T head = stack1.top();
                stack2.push(head);
                stack1.pop();
            }
        }
    
        if(stack2.empty())
            throw new exception("queue is empty.");
    
        T Head = stack2.top();
        stack2.pop();
    
        return Head;
    }

    作者代码的结构安排更紧凑,更简洁!!!

    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    Codeforces 834D The Bakery
    hdu 1394 Minimum Inversion Number
    Codeforces 837E Vasya's Function
    Codeforces 837D Round Subset
    Codeforces 825E Minimal Labels
    Codeforces 437D The Child and Zoo
    Codeforces 822D My pretty girl Noora
    Codeforces 799D Field expansion
    Codeforces 438D The Child and Sequence
    Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D)
  • 原文地址:https://www.cnblogs.com/hello-yz/p/3244835.html
Copyright © 2011-2022 走看看