C++利用两个栈实现队列的方法

 更新时间:2019年05月19日 14:12:40   作者:alxe_made  
这篇文章主要给大家介绍了关于C++利用两个栈实现队列的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧

1. 基础

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

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

2. 思路

两个栈实现一个队列的思想:用pushStack栈作为push数据的栈,用popStack栈作为pop数据的栈。

  1. 只要是对队列进行push操作,就将数据push入pushStack栈中。
  2. 要实现队列的pop操作,有二点原则,如果popStack为空的话那么我们就将pushStack所有的元素放到popStack中,然后取popStack栈顶元素就是队列的队头;如果popStack不为空的话,我们就直接获取popStack的栈顶元素。
  3. 对于top操作来说和pop操作类似,只是最后一步不用pop了。


3. 代码

#include <iostream>
#include <stack>
#include <exception>

template<class T> class MyQueue {
 public:
 void push(const T& num); // 入队列
 T pop(); // 出队列
 T top();
 private:
 std::stack<T> pushStack;
 std::stack<T> popStack;
};
template<typename T>
void MyQueue<T>::push(const T& num) {
 pushStack.push(num);
}
template<typename T>
T MyQueue<T>::pop() {
 if (pushStack.empty() && popStack.empty()) { // 如果二个栈都为空
 throw std::runtime_error("queue is empty");
 } else if (popStack.empty()) { // 如果popStack为空,将pushStack全部元素倒popStack
 while (!pushStack.empty()) {
 T data = pushStack.top(); // 获取pushStack栈顶元素
 pushStack.pop(); // 出栈
 popStack.push(data);
 }
 }
 T data = popStack.top();
 popStack.pop();
 return data;
}
template<typename T>
T MyQueue<T>::top() {
 if (pushStack.empty() && popStack.empty()) { // 如果二个栈都为空
 throw std::runtime_error("queue is empty");
 } else if (popStack.empty()) { // 如果popStack为空,将pushStack全部元素倒popStack
 while (!pushStack.empty()) {
 T data = pushStack.top(); // 获取pushStack栈顶元素
 pushStack.pop(); // 出栈
 popStack.push(data);
 }
 } else { // 如果popStack不为空的话直接返回popStack栈顶
 T data = popStack.top();
 return data;
 }
}
int main() {
 MyQueue<int> myQueue1;
 myQueue1.push(1);
 myQueue1.push(2);
 myQueue1.push(3);
 myQueue1.push(4);
 std::cout << "current pop is:" << myQueue1.pop() << std::endl;
 std::cout << "current pop is:" << myQueue1.pop() << std::endl;
 std::cout << "current pop is:" << myQueue1.pop() << std::endl;
 std::cout << "current pop is:" << myQueue1.pop() << std::endl;
 std::cout << "current pop is:" << myQueue1.pop() << std::endl;

 return 0;
}

4. 参考文献

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

相关文章

  • 共用体的定义与应用详细解析

    共用体的定义与应用详细解析

    共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量
    2013-08-08
  • C语言中find_package()的搜索路径的实现

    C语言中find_package()的搜索路径的实现

    本文主要介绍了C语言中find_package()的搜索路径的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 浅谈C++ 基类指针和子类指针的相互赋值

    浅谈C++ 基类指针和子类指针的相互赋值

    下面小编就为大家带来一篇浅谈C++ 基类指针和子类指针的相互赋值。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C++中stringstream的用法和实例

    C++中stringstream的用法和实例

    下面小编就为大家带来一篇C++中stringstream的用法和实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • C语言编写猜数游戏

    C语言编写猜数游戏

    这篇文章主要为大家详细介绍了C语言编写猜数游戏,可以自定义猜数范围和机会次数,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 详解利用C语言如何实现简单的内存池

    详解利用C语言如何实现简单的内存池

    这篇文章主要给大家介绍了关于C语言如何实现简单的内存池的相关资料,设计内存池的目标是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,需要的朋友可以参考下
    2021-08-08
  • C语言实现投票系统

    C语言实现投票系统

    这篇文章主要为大家详细介绍了C语言实现投票系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 深入剖析设计模式中的组合模式应用及在C++中的实现

    深入剖析设计模式中的组合模式应用及在C++中的实现

    这篇文章主要介绍了设计模式中的组合模式应用及在C++中的实现,组合模式可以清晰地反映出递归构建树状的组合结构,需要的朋友可以参考下
    2016-03-03
  • mingw编译的windows命令行贪吃蛇示例

    mingw编译的windows命令行贪吃蛇示例

    这篇文章主要介绍了mingw编译的windows命令行贪吃蛇示例,需要的朋友可以参考下
    2014-04-04
  • C语言二维数组中的查找的实例

    C语言二维数组中的查找的实例

    这篇文章主要介绍了C语言二维数组中的查找的实例的相关资料,需要的朋友可以参考下
    2017-07-07

最新评论