C++用两个队列实现栈

博客介绍了队列和栈的基础概念,队列先进先出,栈后进先出。重点阐述了用两个队列实现一个栈的思路,包括push、pop和top操作的具体实现方法,还提及代码调试情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 基础

  1. 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行;

  2. 栈:后进先出,即插入与删除数据均在栈顶进行。

2. 思路

两个队列实现一个栈的思想:用dataQueue队列作为push数据的队列,用helpQueue队列暂存数据。

  1. 只要是对栈进行push操作,就将数据push入dataQueue队列中。
  2. 要实现栈的pop操作,就要在dataQueue队列不为空的情况下,把dataQueue队列中的N-1个数据按照队列的pop规则,都转移到helpQueue队列中,直到dataQueue中的数据只有一个时结束转移,然后我们将dataQueue最后一个元素返回就是栈顶元素。这个时候我们对dataQueue进行pop操作,dataQueue变成空队列,而此时helpQueue有N-1个元素。所以最后一步我们交换两个队列,让其可以一直pop操作。
  3. 对于top操作来说和pop操作类似,唯一的不同就是我们需要将res在放到我们的helpQueue里面。
    在这里插入图片描述

3. 代码

#include <iostream>
#include <queue>
#include <exception>

template<class T> class MyStack {
 public:
     void push(const T& num);
     T pop();
     T top();
     void swapQueue();// 交换dataQueue和helpQueue
 private:
    std::queue<T> dataQueue;    // 数据队列
    std::queue<T> helpQueue;    // 帮助队列
};
template<typename T>
void MyStack<T>::swapQueue() {
    std::queue<T> tmp = dataQueue;
    dataQueue = helpQueue;
    helpQueue = tmp;
}
template<typename T>
void MyStack<T>::push(const T& num) {   // 不管是上面情况,送入数据都是放到dataQueue里面
    dataQueue.push(num);
}
template<typename T>
T MyStack<T>::pop() {
    if (dataQueue.empty()) {
        throw std::runtime_error("queue is empty");
    } else {
        while (dataQueue.size() > 1) {  // 当dataQueue
            helpQueue.push(dataQueue.front());
            dataQueue.pop();
        }
        T res = dataQueue.front();    // 这个dataQueue的最后元素也就是stack的栈顶元素
        dataQueue.pop();    // dataQueue已经为空,helpQueue存放n-1个数
        swapQueue();   // 交换二个队列
        return res;
    }
}
template<typename T>
T MyStack<T>::top() {
    if (dataQueue.empty()) {
        throw std::runtime_error("queue is empty");
    } else {
        while (dataQueue.size() > 1) {  // 当dataQueue
            T data = dataQueue.front();
            dataQueue.pop();
            helpQueue.push(data);
        }
        T res = dataQueue.front();    // 这个dataQueue的最后元素也就是stack的栈顶元素
        dataQueue.pop();    // 此时dataQueue已经为空,helpQueue存放n-1个数
        helpQueue.push(res);    // 获取top元素需要将原来数据返回
        swapQueue();
        return res;
    }
}

int main() {
    MyStack<int> s;
	s.push(4);
	s.push(6);
	s.push(3);
	s.push(1);
	std::cout << s.pop() << std::endl;
	std::cout << s.pop() << std::endl;
    s.push(5);
	std::cout << s.pop() << std::endl;
	std::cout << s.pop() << std::endl;

	return 0;
}

在这里插入图片描述

4. 参考文献

  1. 面试题:用两个队列实现一个栈
  2. [C++基础]队列中的常用函数

调试这个代码还是耗费了一点点时间的,这里就要debug了~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值