栈和队列面试题(三)---用两个队列实现一个栈
来源:互联网 发布:getting windows ready 编辑:程序博客网 时间:2024/05/21 17:04
一:queue是一种”先进先出”的数据结构,他在对尾插入元素,在队头删除元素,他既可以取到自己的队头元素,也可以取到自己的队尾元素;
stack是一种”先进后出”的数据结构,他对元素的插入和删除都是在栈顶完成的;他不可以取自己栈底的元素;只能去取自己栈顶的元素;
所以用两个队列实现一个栈,就是用队列”先进先出“的原则实现栈“先进后出”特点:
所以只要实现栈的插入,删除,和返回栈顶元素三个方法即可;
(1)插入:每次找不为空的队列进行插入,这样就不存在确定的辅助队列和主队列之说,两个队列交替存储数据;这样效率更高;
(2)删除;每次先找到不为空的队列,然后将这个队列当做主队列,将另一个辅助队列,将主队列的数据依次取队头元素插入辅助队列,直到主队列剩下一个元素;然后利用栈的头删功能将次元素删除;
(3)返回栈顶元素:那个队列不为空,就取那个队列的队尾返回;这就是栈的栈顶元素;
二:图说
三:代码实现:
#include <iostream>using namespace std;#include <queue>template<class T>class Stack{public: void Push(const T& data)//插入 { if (_q1.empty()&&_q2.empty())//两个队列都为空 { _q1.push(data);//向_q1种插入元素 } else if(!_q1.empty())//q1不为空,q2为空 { _q1.push(data);//向_q1种插入元素 } else//q1为空,q2不为空 { _q2.push(data);//向_q2种插入元素 } } void Pop()//删除 { //if (_q1.empty()&&_q2.empty())//_q1,_q2为空 //{ // cout<<"无元素"<<endl; //} /*else*/ if (!_q1.empty())//_q1不为空,_q2为空 { while (_q1.size()>1)//转移元素到_q2,_q1中留下一个删除 { _q2.push(_q1.front()); _q1.pop(); } _q1.pop();//_q1中留下一个删除 } else //_q2不为空,_q1为空 { while (_q2.size()>1)//转移元素到_q1,_q2中留下一个删除 { _q1.push(_q2.front()); _q2.pop(); } _q2.pop();//_q2中留下一个删除 } } T& Top()//取栈顶元素 { if (!_q1.empty())//如果_q1不为空,_q2为空 { return _q1.back();//返回_q1队尾元素 } else//如果_q1为空,_q2不为空 return _q2.back(); }private: //两个队列成员 queue<T> _q1; queue<T> _q2;};
测试用例:
void test(){ Stack<int> s; s.Push(1); s.Push(2); s.Push(3); s.Push(4); cout<<s.Top()<<endl; s.Pop(); s.Pop(); cout<<s.Top()<<endl;}int main(){ test(); system("pause"); return 0;}
四、运行结果
☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺☺
0 0
- 栈和队列面试题(三)---用两个队列实现一个栈
- 面试题(两个栈实现一个队列和两个队列实现一个栈)
- 栈和队列的面试题(四)---用两个栈实现一个队列
- 面试题7:用两个栈实现队列和用两个队列实现一个栈
- 面试题-----两个栈实现一个队列
- 面试题7两个栈实现一个队列和两个队列实现一个栈
- 两个栈实现一个队列——栈和队列面试题(2)
- 两个队列实现一个栈——栈和队列面试题(3)
- 栈&队列面试题之两个队列实现一个栈
- 面试题--用两个栈实现一个队列
- 经典面试题一:用两个栈实现一个队列
- 面试题 用两个栈实现一个队列
- 《剑指Offer》面试题:用两个队列实现一个栈
- 面试题8:用两个栈实现一个队列
- 面试题:用两个栈实现一个队列
- 面试题:用两个队列实现一个栈
- 面试题之用两个栈实现一个队列
- 面试题7:用两个栈实现一个队列
- 自定义test之java json字符串转map或list
- SQL语句(一)
- Android 判断用户是否第一次进入APP
- %d,%c,%s,%x各代表什么
- ApplicationContext——类注解的配置方式
- 栈和队列面试题(三)---用两个队列实现一个栈
- 如何编译安装Lua5.3,实现调用C共享库
- 动态规划系列(1)——金矿模型的理解
- centos7安装rabbitmq
- CI xlsx 文件类型错误, CI上传文件 xlsx 修改类型mimes
- deeplearning4j之卷积神经网络实现
- Python 算法
- java-基本语法
- java多态,如何理解父类引用指向子类对象