【C++面试题】利用两个栈实现1个队列
来源:互联网 发布:excel批量打印软件 编辑:程序博客网 时间:2024/06/18 13:01
1、题目
利用两个栈实现一个队列2、要求
只能使用栈的pop(),top()和push(),以及测试栈是否为空empty()四个操作. 来实现队列的empty(), push(),pop(),back(),front()等操作。
3、准备
做这道题之前先分别了解下栈和队列相关知识点。queue 是一种先进先出(first in first out, FIFO)的数据类型,他有两个口,数据元素只能 从一个口进,从另一个口出.队列只允许从队尾加入元素,队头删除元素,必须符合先进先 出的原则,queue 和 stack 一样不具有遍历行为。如下图所示:
stack 是一种先进后出(first in last out,FILO)的数据结构,它只有一个出口,stack 只允许在栈顶新增元素,移除元素,获得顶端元素,但是除了顶端之外,其他地方不允许存取 元素,只有栈顶元素可以被外界使用,也就是说 stack 不具有遍历行为,没有迭代器。
4、思路总结
- 实现队列的pop方法弹出队头元素:stack是一个口进出,也不支持随机存取,所以你无法直接从栈底拿到第一个元素。要想拿到第一个元素,需要将左边栈容器中的所有元素拷贝到右边栈容器中。由于stack先进后出的数据结构,这样左边容器的第一个元素会作为最后一个元素存储到右边栈容器中,这样不就拿到左边栈容器中的第一个元素了吗 ?
- 实现队列的back方法获取队列的队尾元素:逻辑和思路1一样,唯一不同的是pop和top
//// 利用两个栈实现⼀个队列.cpp// c++//// Created by 刘龙玲 on 16/1/29.// Copyright © 2016年 liulongling. All rights reserved.//#include <iostream>#include <stack>using namespace std;template <class T>class MyQueue{public: bool empty()const { return head.empty()&&tail.empty(); } void push(T t) { head.push(t); } //删除对头元素 //因为queue是一种先进先出,而stack是先进后出,所以需要把head里的数据拷贝到tail中然后再从tail中pop头元素 void pop() { if(this->empty()) { //throw exception("队列为NULL"); } while(!head.empty()) { tail.push(head.top()); head.pop(); } //删除头元素 tail.pop(); //再将队尾栈容器元素拷贝到队头栈容器中 while(!tail.empty()) { head.push(tail.top()); tail.pop(); } } T& back() { if(this->empty()) { // throw exception("head is NULL"); } return head.top(); } //返回第一个元素 T& front() { if(this->empty()) { //throw exception("队列为NULL"); } while(!head.empty()) { tail.push(head.top()); head.pop(); } int tmp = tail.top(); //再将队尾栈容器元素拷贝到队头栈容器中 while(!tail.empty()) { head.push(tail.top()); tail.pop(); } return tmp; } private: stack<int> head; stack<int> tail;};int main(){ MyQueue<int> q; for(int i=1;i<5;i++) { q.push(i); } cout<<"front:"<<q.front()<<endl; cout<<"back:"<<q.back()<<endl; return 0;}
作者:小毛驴,一个游戏人
梦想:世界和平
原文地址:http://blog.csdn.net/liulongling
本博客中未标明转载的文章归作者小毛驴所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
0 0
- 【C++面试题】利用两个栈实现1个队列
- 面试题整理-两个栈实现队列
- 面试题7 两个栈实现队列
- 面试题-----两个栈实现一个队列
- 面试题 两个队列实现栈
- 栈&队列面试题之两个队列实现一个栈
- 面试题7(1):用2个栈实现队列
- C++:利用两个栈实现队列操作
- 数据结构面试题(1)--用两个队列实现一栈和用两个栈实现一个队列
- 面试题13 - 用两个栈实现队列 【栈】
- 【数据结构】栈面试题--两个栈实现一个队列
- 【数据结构】栈面试题--两个队列实现一个栈
- 面试题--用两个栈实现一个队列
- 面试题研究 用两个栈模拟实现队列
- 剑指offer-->面试题7 用两个栈实现队列
- 经典面试题一:用两个栈实现一个队列
- 面试题7:用两个栈实现队列
- 面试题6:用两个栈实现队列
- iOS多线程的初步研究(九)-- dispatch源
- Git安装
- spring注解autowired与resource的区别
- 第四篇扩展篇—哈哈,终于等到这一天! 第26回 主公,我来考考你
- 进程间传递数据
- 【C++面试题】利用两个栈实现1个队列
- PDO参数化查询
- HttpRequest请求接口
- 远程桌面,RDP文件密码加密、解密算法(C#)
- iOS 跳转到系统的设置界面
- OS X 10.8.1 系统 HomeBrew的安装和简单使用
- iOS开发——关于拷贝的iOS工程在其他电脑上不能真机和模拟器运行,即只有MyMac设备,没有其他设备
- C++标准模板库
- CSS3选择器(全)