剑指offer笔记——面试题9:用两个栈实现队列


用两个栈实现一个队列

问题描述

用两个栈实现一个队列,队列的功能有:在队尾插入结点、在队列头部删除结点

代码

CQueue.h

#ifndef CQUEUE_H
#define CQUEUE_H
#include <iostream>
#include <stack>

template <typename T>
class CQueue
{
public:
    CQueue();
    ~CQueue();
    void appendTail(const T&);
    T deleteHead();
protected:
private:
    std::stack<T> stack1;
    std::stack<T> stack2;
};

#endif // CQUEUE_H

CQueue.cpp

#include "CQueue.h"
/**
 * 构造函数
 */
template <typename T>
CQueue<T>::CQueue()
{

}
/**
 * 析构函数
 */
template <typename T>
CQueue<T>::~CQueue()
{

}
/**
 * 在队尾插入结点
 */
template <typename T>
void CQueue<T>::appendTail(const T& node)
{
    stack1.push(node);  // 此时stack1和stack2中可以都有元素,也可以只有stack2中有,也可以stack1中有,都不会影响程序有效性
}
/**
 * 在队列头部删除结点
 */
template <typename T>
T CQueue<T>::deleteHead()
{
    if(stack2.empty())  // 只有stack2为空时才能把stack1元素插入stack2中,否则实现的就不是队列了
    {                    // stack2不为空时直接弹出stack2头部元素即可,stack1不需要动
        for(; !stack1.empty();)
        {
            stack2.push(stack1.top());
            stack1.pop();
        }
    }
    if(stack2.empty())  // 注意这里的异常处理,确保stack2不为空才能pop
    {
        std::logic_error e("queue is empty");
        throw new std::exception(e);
    }
    T head = stack2.top();
    stack2.pop();
    return head;
}

template class CQueue<int>;
template class CQueue<float>;
template class CQueue<double>;

main.cpp

#include <iostream>
#include "CQueue.h"

int main()
{
    CQueue<int> CQueue1;
    int num = 1;
    CQueue1.appendTail(num);
    num = 2;
    CQueue1.appendTail(num);
    num = 3;
    CQueue1.appendTail(num);
    std::cout << CQueue1.deleteHead() << std::endl;
    std::cout << CQueue1.deleteHead() << std::endl;
    std::cout << CQueue1.deleteHead() << std::endl;
    std::cout << CQueue1.deleteHead() << std::endl;
    return 0;
}

运行结果

在这里插入图片描述

相关题目:用两个队列实现一个栈

问题描述

用两个队列实现一个栈

代码

CStack.h

#ifndef CSTACK_H
#define CSTACK_H
#include <iostream>
#include <queue>

template <typename T>
class CStack
{
public:
    CStack();
    ~CStack();
    void appendHead(const T&);
    T deleteHead();
protected:
private:
    std::queue<T> queue1;
    std::queue<T> queue2;
};

#endif // CSTACK_H

CStack.cpp

#include "CStack.h"

/**
 * 构造函数
 */
template <typename T>
CStack<T>::CStack()
{

}
/**
 * 析构函数
 */
template <typename T>
CStack<T>::~CStack()
{

}
/**
 * 入栈
 */
template <typename T>
void CStack<T>::appendHead(const T& node)
{
    if((!queue1.empty() && queue2.empty()) || (queue1.empty() && queue2.empty()))
        queue1.push(node);
    else if(queue1.empty() && !queue2.empty())
        queue2.push(node);
    else
        std::cout << "something went wrong" << std::endl;
}

/**
 * 出栈
 */
template <typename T>
T CStack<T>::deleteHead()
{
    if(!queue1.empty() && queue2.empty())
    {
        for(; queue1.size() > 1;)
        {
            queue2.push(queue1.front());
            queue1.pop();
        }
        T temp = queue1.front();
        queue1.pop();
        return temp;
    }
    else if(queue1.empty() && !queue2.empty())
    {
        for(; queue2.size() > 1;)
        {
            queue1.push(queue2.front());
            queue2.pop();
        }
        T temp = queue2.front();
        queue2.pop();
        return temp;
    }
    else if(!queue1.empty() && !queue2.empty())
    {
        std::cout << "something went wrong" << std::endl;
        return T(-1);
    }
    else
    {
        std::cout << "the stack is empty, no node to pop" << std::endl;
        return T(-1);
    }
}

template class CStack<int>;
template class CStack<float>;
template class CStack<double>;


main.cpp


#include <iostream>
#include "CStack.h"

int main()
{
    CStack<int> CStack1;
    int num = 1;
    CStack1.appendHead(num);
    num = 2;
    CStack1.appendHead(num);
    num = 3;
    CStack1.appendHead(num);
    std::cout << CStack1.deleteHead() << std::endl;
    std::cout << CStack1.deleteHead() << std::endl;
    std::cout << CStack1.deleteHead() << std::endl;
    std::cout << CStack1.deleteHead() << std::endl;
    return 0;
}

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值