【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
http://blog.csdn.net/hanjing_1995/article/details/51539578
使用两个栈实现一个队列
思路一:
我们设定s1是入栈的,s2是出栈的。
入队列,直接压到s1即可
出队列,先把s1中的元素倒入到s2中,弹出s2中的栈顶元素;再把s2的剩余元素全部倒回s1中。
缺点:
每次只要出栈一个元素就要将元素倒来倒去,麻烦!!!
思路2:
入队列时:
如果s1为空,把s2中所有的元素倒出压到s1中。否则直接压入s1
出队列时:
如果s2不为空,把s2中的栈顶元素直接弹出。否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
思路1无条件地每次都要将元素倒来倒去,思路2出队时较思路1简单
思路3:
我们设定s1是入栈的,s2是出栈的
入队列:直接压入元素至s1即可
出队列:如果s2不为空,把s2中的栈顶元素直接弹出。否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素
相比于方法2,入队直接压入即可~
那么,我们可以看出,思路三最简单,我们下面看下代码。
代码实现:
1)我们直接调用库里的stack来实现。(一般调用库里的就行了)
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<iostream>
- using namespace std;
- //两个栈实现一个队列
- #include<stack>
- template<class T>
- class Queue
- {
- public:
- void appendTail(const T& x)
- {
- s1.push(x);
- }
- void deleteHead()
- {
- if (s2.empty())
- {
- while (!s1.empty())
- {
- s2.push(s1.top());
- s1.pop();
- }
- cout << s2.top() << " ";
- s2.pop();
- }
- else
- {
- cout << s2.top() << " ";
- s2.pop();
- }
- }
- private:
- stack<T> s1;
- stack<T> s2;
- };
- void Test()
- {
- Queue<int> q;
- q.appendTail(1);
- q.appendTail(2);
- q.appendTail(3);
- q.appendTail(4);
- q.deleteHead();
- q.deleteHead();
- q.deleteHead();
- q.deleteHead();
- }
- int main()
- {
- Test();
- system("pause");
- return 0;
- }
2)自己实现栈实现。
- #define _CRT_SECURE_NO_WARNINGS 1
- #include<iostream>
- using namespace std;
- #include<assert.h>
- //直接实现Stack,也可以用适配器实现栈,或者用库。
- //将Stack基本功能实现如下:
- template<class T>
- class Stack
- {
- public:
- Stack()
- :_array(NULL)
- , _size(0)
- , _capacity(0)
- {}
- Stack<T>(const Stack<T>& s)
- : _array(new T[s._capacity])
- {
- swap(_array, s._array);
- swap(_size, s._size);
- swap(_capacity, s._capacity);
- }
- Stack<T>& operator=(const Stack<T>& s)
- {
- if (&s != this)
- {
- swap(_array, s._array);
- swap(_size, s._size);
- swap(_capacity, s._capacity);
- }
- return *this;
- }
- ~Stack()
- {
- if (_array)
- {
- delete[] _array;
- _array = NULL;
- }
- }
- void _CheckCapacity()
- {
- if (_size == 0)
- {
- _capacity = 3;
- _array = new T[_capacity];
- }
- if (_size >= _capacity)
- {
- _capacity *= 2;
- T* tmp = new T[_capacity];
- for (int index = 0; index < _size; index++)
- {
- tmp[index] = _array[index];
- }
- delete[] _array;
- _array = tmp;
- }
- }
- void Push(const T& x)
- {
- _CheckCapacity();
- _array[_size++] = x;
- }
- void Pop()
- {
- if (_size == 0)
- {
- return;
- }
- --_size;
- }
- size_t Size()
- {
- return _size;
- }
- bool Empty()
- {
- return Size() == 0;
- }
- T& Top()
- {
- assert(_size > 0);
- return _array[_size - 1];
- }
- private:
- T* _array;
- size_t _size;
- size_t _capacity;
- };
- template<class T>
- class Queue
- {
- public:
- void InQueue(const T& x)
- {
- s1.Push(x);
- }
- void OutQueue()
- {
- //栈s2为空,则将栈s1的元素全部倒入s2中,再弹出最上面的那个元素
- if (s2.Empty())
- {
- while (!s1.Empty())
- {
- s2.Push(s1.Top());
- s1.Pop();
- }
- s2.Pop();
- }
- //栈s2不为空,直接弹出元素
- else
- {
- s2.Pop();
- }
- }
- void Print() //打印队列元素,分四种情况。
- {
- if (s1.Empty() && s2.Empty())
- {
- cout << "The Queue is Empty!";
- }
- else if (!s1.Empty() && s2.Empty())
- {
- while (!s1.Empty())
- {
- s2.Push(s1.Top());
- s1.Pop();
- }
- while (!s2.Empty())
- {
- cout << s2.Top() << " ";
- s2.Pop();
- }
- }
- else if (s1.Empty() && !s2.Empty())
- {
- while (!s2.Empty())
- {
- cout << s2.Top() << " ";
- s2.Pop();
- }
- }
- else
- {
- while (!s2.Empty())
- {
- cout << s2.Top() << " ";
- s2.Pop();
- }
- while (!s1.Empty())
- {
- s2.Push(s1.Top());
- s1.Pop();
- }
- while (!s2.Empty())
- {
- cout << s2.Top() << " ";
- s2.Pop();
- }
- }
- cout << endl;
- }
- private:
- Stack<T> s1; //入队
- Stack<T> s2; //出队
- };
- //测试两个栈实现一个队列
- void Test1()
- {
- Queue<int> q1;
- q1.InQueue(1);
- q1.InQueue(2);
- q1.InQueue(3);
- q1.InQueue(4);
- /*q1.Print();*/
- q1.OutQueue();
- /*q1.Print();*/
- q1.InQueue(5);
- q1.InQueue(6);
- q1.InQueue(7);
- q1.Print();
- }
- int main()
- {
- Test1();
- system("pause");
- return 0;
- }
(1个细节):
注意再将元素倒入另一个栈时,代码并不是先pop,再push。因为这样push后元素就找不到了。因此要先访问到栈顶元素top,再push,而后pop。
本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1763006
【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)相关推荐
- 数据结构:栈和列之如何用两个队列实现一个栈?两个栈实现一个队列?
1.栈和队列分析 栈是一种特殊的线性表.其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行 队列(Queue)也是一种运算受限的线性表,它的运算限制与栈不同,是两头都有限制,插入只能在表的 ...
- 记一道面试题:STL两个栈实现一个队列。
面试题目 STL两个栈实现一个队列. 要求:只能使用栈的pop(),top()和push(),以及测试栈是否为空 empty()四个操作. 来实现队列的clear(), push(),pop(),ba ...
- 算法图解:如何用两个栈实现一个队列?
作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 本文已收录至 https://github.com/vipstone/algori ...
- 包含min函数的栈和两个栈实现一个队列
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:这是google的一道面试题. 看到这道题目时,第一反应就是每 ...
- java 栈和队列实现迷宫代码_算法图解:如何用两个栈实现一个队列?
本文已收录至 https://github.com/vipstone/algorithm <算法图解>系列. 队列和栈是计算机中两个非常重要的数据结构,经过前面的学习(<队列> ...
- 两个栈实现一个队列,两个队列实现一个栈
题目:用两个栈实现一个队列,用两个队列实现一个栈. 首先要了解栈和队列这两种数据结构各自的特点,栈是一种后入先出(Last In First Out,LIFO)的数据结构,队列是一种先进先出(Firs ...
- 由两个栈组成一个队列
使用C++完成<程序员代码面试指南 IT名企算法与数据结构题目> 题目 编写一个类,用两个栈实现队列,支持队列操作: - push:入队 - pop:出队(不返回值) - front:返回 ...
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 【剑指offer】用两个栈实现一个队列
题目:两个栈实现一个队列. 栈的特点:先进后出,队列的特点是先进先出 思路:stack1放入数据:pop时,先判断stack2是否为空,如果不为空,直接pop,如果空,则push(stack1.pop ...
最新文章
- 香港理工大学计算机专业课程,香港理工大学 19年入学 计算机硕士信息一览
- curl学习(实例不断总结)
- 图解SQL子查询实例
- T-SQL 中ON和WHERE的区别
- 由for V.S. for each想到的
- mysql解压rpm文件在哪_[mysql] mysql 源码安装解压 rpm 包命令
- sun java认证真题,sun scjp考试心得_java认证
- 网页版结题报告html没了,[转载]我的结题报告
- php sqlhelper,php中分页及SqlHelper类用法实例
- 系统架构设计师:软件开发基础知识
- 好课堂Scratch编程08 趣学篇(四)密林深处的危险气息
- uniapp 自定义模板
- 重整晋商雄风,再现汇通天下 -------《晋商》阅读笔记第5-6章
- mac photoshop cs5.1 序列号
- U盘, USB读卡器, U盘读卡器三者技术分析区别
- PEAP认证环境搭建及认证的大体流程
- RS-一般推荐(CF系列)-2018:GCMC
- 城市物流管理系统的设计与实现
- xposed的总开关
- android WebView加载视频只有声音没有画面
热门文章
- sublime text3 使用SVN插件
- ajax eval html,Ajax eval的应用示例
- linux算法平台,Linux实时调度算法与测试平台的研究与实现
- python 浏览器显示本地文件夹_浏览器读取本地文件
- 计算机二级目录设置,word2设置标题格式,生成目录,奇偶页设置等等,适用考计算机二级办公软件,也适用于毕业论文格式设置...
- linux编译ffmpeg成so,「ffmpeg」一 mac 环境下编译ffmpeg,生成so库文件
- java程序日期转换_Java 日期转换详解及实例代码
- JavaScript学习随记——对象
- C++11的静态断言
- java和c++的区别大吗_大空间消防水炮ZDMS0.8/30S坐装和吊装有区别吗?