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

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

    清醒时做事,糊涂时读书,大怒时睡觉,独处时思考; 做一个幸福的人,读书,旅行,努力工作,关心身体和心情,成为最好的自己 -- 共勉
  • 相关阅读:
    DC综合流程
    DC set_tcl脚本配置
    同步FIFO设计
    顺序脉冲 发生器
    状态机的写法
    verilog串并转换
    indexOf()
    jQuery 效果
    jQuery 事件
    jQuery css
  • 原文地址:https://www.cnblogs.com/hello-yz/p/3244835.html
Copyright © 2011-2022 走看看