《剑指Offer》面试题:用两个队列实现一个栈
2015-10-19 18:27
447 查看
思路
假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元素为b,接下来如果再执行入栈操作,则需要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样,将Q2除最后一个元素外全部出队,并依次进入队列Q1,再将Q2的最后一个元素出队即可。
假设有两个队列Q1和Q2,当二者都为空时,入栈操作可以用入队操作来模拟,可以随便选一个空队列,假设选Q1进行入栈操作,现在假设a,b,c依次入栈了(即依次进入队列Q1),这时如果想模拟出栈操作,则需要将c出栈,因为在栈顶,这时候可以考虑用空队列Q2,将a,b依次从Q1中出队,而后进入队列Q2,将Q1的最后一个元素c出队即可,此时Q1变为了空队列,Q2中有两个元素,队头元素为a,队尾元素为b,接下来如果再执行入栈操作,则需要将元素进入到Q1和Q2中的非空队列,即进入Q2队列,出栈的话,就跟前面的一样,将Q2除最后一个元素外全部出队,并依次进入队列Q1,再将Q2的最后一个元素出队即可。
/* 用两个队列模拟入栈操作 */ void push(PQUEUE pS1,PQUEUE pS2,int val) { if(is_empty(pS2)) en_queue(pS1, val); else en_queue(pS2, val); } /* 用两个队列模拟出栈操作 */ bool pop(PQUEUE pS1,PQUEUE pS2,int *pData) { if(is_empty(pS1) && is_empty(pS2)) return false; int DelData; //在非空的队列中进行操作。 if(!is_empty(pS2)) { int len = length(pS2); while(len-- > 1) { de_queue(pS2,&DelData); en_queue(pS1,DelData); } //将队列的最后一个元素出队,作为出栈元素 de_queue(pS2,pData); return true; } if(!is_empty(pS1)) { int len = length(pS1); while(len-- > 1) { de_queue(pS1,&DelData); en_queue(pS2,DelData); } //将队列的最后一个元素出队,作为出栈元素 de_queue(pS1,pData); return true; } }
相关文章推荐
- 关于ArrayList的5道面试题
- 黑马程序员--Java学习日记之面向对象(多态,接口和其他关键字)
- 怎么样才能在初入职场风生水起
- 黑马程序员 Java基础——Collection接口
- 【笔面试】字符流和字节流的区别以及如何解决乱码问题
- 2015-10-19深圳面试
- 关于.Net的面试遐想
- 给Android程序员的一些面试建议
- 做过的面试题(四)
- 创业泡沫的「军功章」,高薪低能的程序员要分走一半
- 软件测试面试 (二)如何测试网页的登录页面 如何测试一个杯子 关于测试方法的
- 黑马程序员--Java学习日记之面向对象(封装,继承和构造方法)
- 《剑指Offer》面试题:用两个栈来实现一个队列
- 黑马程序员——JAVA之IO
- 程序员们为什么不能“面朝大海,春暖花开?”
- 程序员们为什么不能“面朝大海,春暖花开?”
- 程序员们为什么不能“面朝大海,春暖花开?”
- 黑马程序员——Java中的集合(上)
- 专访雷果国:从1.5K到18K 一个程序员的5年成长之路
- 黑马程序员——java基础---IO---字符流