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;
    }

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

    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/hello-yz/p/3244835.html
Copyright © 2011-2022 走看看