• 《剑指offer》第九题:用两个栈实现队列


    // 面试题9:用两个栈实现队列
    // 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail
    // 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
    
    #pragma once
    #include <stack>
    #include <exception>
    
    using namespace std;
    
    template <typename T> class CQueue //模板, T为类型名
    {
    public:
        CQueue(void); //构造函数
        ~CQueue(void); //析构函数
    
        // 在队列末尾添加一个结点
        void appendTail(const T& node);
    
        // 删除队列的头结点
        T deleteHead();
    
    private:
        stack<T> stack1;
        stack<T> stack2;
    };
    
    //CQueue<T>:: 为作用域
    template <typename T> CQueue<T>::CQueue(void)
    {
    }
    
    template <typename T> CQueue<T>::~CQueue(void)
    {
    }
    
    template<typename T> void CQueue<T>::appendTail(const T& element)
    {
        //数据压入stack1
        stack1.push(element);
    }
    
    template<typename T> T CQueue<T>::deleteHead()
    {
        //如果stack2为空,则从stack1中载入数据
        if (stack2.size() <= 0)
        {
            while (stack1.size() > 0)
            {
                T& data = stack1.top();
                stack1.pop();
                stack2.push(data);
            }
        }
    
        //如果载入完还没数据, 则序列为空
        if (stack2.size() == 0)
            throw new exception("Empty queue");
    
        //弹出头部数据
        T head = stack2.top();
        stack2.pop();
    
        return head;
    
    }
    // 面试题9:用两个栈实现队列
    // 题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail
    // 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
    
    #include "Queue.h"
    
    // ====================测试代码====================
    void Test(char actual, char expected)
    {
        if (actual == expected)
            printf("Test passed.
    ");
        else
            printf("Test failed.
    ");
    }
    
    int main(int argc, char* argv[])
    {
        CQueue<char> queue;
    
        queue.appendTail('a');
        queue.appendTail('b');
        queue.appendTail('c');
    
        char head = queue.deleteHead();
        Test(head, 'a');
    
        head = queue.deleteHead();
        Test(head, 'b');
    
        queue.appendTail('d');
        head = queue.deleteHead();
        Test(head, 'c');
    
        queue.appendTail('e');
        head = queue.deleteHead();
        Test(head, 'd');
    
        head = queue.deleteHead();
        Test(head, 'e');
    
        return 0;
    }
    测试代码

    分析:分析实际案例总结规律。

    牛客网给出了数据类型,不知道函数直接这样写到类定义内是否正确。

    class Solution
    {
    public:
        void push(int node) {
            stack1.push(node);
        }
    
        int pop() {
            if (stack2.size() <= 0)
            {
                while (stack1.size() > 0)
                {
                    int data = stack1.top();
                    stack1.pop();
                    stack2.push(data);
                }
            }
            
            if (stack2.size() == 0)
                ;
                //throw new exception("Empty queue");
            
            int head = stack2.top();
            stack2.pop();
            return head;
        }
    
    private:
        stack<int> stack1;
        stack<int> stack2;
    };
    牛客网提交代码

    相关题目:思路几乎一致,

    栈的弹出操作:队列1删除头节点并保存到队列2直到队列为空,最后的头节点为top值。

    栈的写入操作:正常压入到当前非空队列尾部。

  • 相关阅读:
    Python列表、元组、字典、集合的方法
    Python字符串方法总结
    进程、线程、协和的对比
    案例:图片下载器
    使用gevent实现多任务
    使用greenle完成多任务
    使用yield完成多任务
    生成器总结
    生成器send函数
    生成器yield关键字
  • 原文地址:https://www.cnblogs.com/ZSY-blog/p/12546599.html
Copyright © 2020-2023  润新知