zoukankan      html  css  js  c++  java
  • {面试题7: 使用两个队列实现一个栈}

    From 剑指Offer 何海涛 著

    #include <iostream>
    #include <exception>
    #include <queue>
    
    template <typename T>
    class CStack {
        public:
            CStack(void);
            ~CStack(void);
            
            T& top(void);
            void push(const T&);
            void pop(void);
            
        private:
            std::queue<T> queue1;
            std::queue<T> queue2;
    };
    
    
    template <typename T>
    CStack<T>::CStack() {
        
    }
    
    template <typename T>
    CStack<T>::~CStack() {
        
    }
    
    template <typename T>
    T& CStack<T>::top() {
       if(queue1.empty()) {
           if(queue2.empty()) {
               throw std::exception();
           }
    #if __cplusplus >= 201103L
           queue1.swap(queue2);
    #else
           while(queue2.size() > 1) {
               T& t = queue2.front();
               queue1.push(t);
               queue2.pop();
           }
           T& t = queue2.front();
           queue1.push(t);
           queue2.pop();
           return t;
    #endif
       }
       while(queue1.size() > 1) {
           T& t = queue1.front();
           queue2.push(t);
           queue1.pop();
       }
       T& t = queue1.front();
       queue2.push(t);
       queue1.pop();
       return t;
    }
    
    template <typename T>
    void CStack<T>::push(const T& value) {
        if(queue1.empty()) {
    #if __cplusplus >= 201103L
            queue1.swap(queue2);
    #else
            queue2.push(value);
            return;
    #endif
        }
        queue1.push(value);
        
    }
    
    template <typename T>
    void CStack<T>::pop() {
        if(queue1.empty()) {
            if(queue2.empty()) {
                throw std::exception();
            }
    #if __cplusplus >= 201103L
            queue1.swap(queue2);
    #else
            while(queue2.size() > 1) {
                T& t = queue2.front();
                queue1.push(t);
                queue2.pop();
            }
            queue2.pop();
            return ;
    #endif
        }
        while(queue1.size() > 1) {
            T& t = queue1.front();
            queue2.push(t);
            queue1.pop();
        }
        queue1.pop();
    }

    测试集:

    template <typename T>
    void test(const T& actual, const T& expected) {
        std::cout << std::boolalpha << (actual == expected) << std::endl;
    }
    
    int main(int argc, char* argv[]) {
        CStack<char> stack;
        
        try {
            stack.top();
        } catch(std::exception& e) {
            std::cout << "true" << std::endl;
        }
        
        stack.push('a');
        stack.push('b');
        stack.push('c');
        
        test(stack.top(), 'c');
        stack.pop();
        test(stack.top(), 'b');
        stack.push('d');
        test(stack.top(), 'd');
        stack.pop();
        stack.pop();
        stack.pop();
    
        try {
            stack.pop();
        } catch(std::exception& e) {
            std::cout << "true" << std::endl;
        }
        
        return 0;
    
    }
  • 相关阅读:
    Python面向对象5:类的常用魔术方法
    吴恩达机器学习笔记27-样本和直观理解2(Examples and Intuitions II)
    python之面向对象
    python之正则表达式
    python之模块
    python之函数
    python之基础
    python之入门
    Git+码云安装
    python,pycharm环境安装
  • 原文地址:https://www.cnblogs.com/long3216/p/4439715.html
Copyright © 2011-2022 走看看