面试题7:用两个栈实现队列
2015-05-29 18:40
531 查看
题目:用两个栈实现一个队列。
思路:添加时只有一种情况,将元素直接压入栈1,删除时有两种情况,第一种情况栈2为空,此时需要先将栈1的所有元素压入栈2,然后清空栈1,并将栈2的栈顶元素出栈,第二种情况是栈2不为空,此时直接将栈2的栈顶元素出栈即可。
C++:
Java:
思路:添加时只有一种情况,将元素直接压入栈1,删除时有两种情况,第一种情况栈2为空,此时需要先将栈1的所有元素压入栈2,然后清空栈1,并将栈2的栈顶元素出栈,第二种情况是栈2不为空,此时直接将栈2的栈顶元素出栈即可。
C++:
#include <iostream> #include <stack> using namespace std; template<typename T> class CQueue { public: CQueue(void); ~CQueue(void); void appendTail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; template<typename T> void CQueue<T>::appendTail(const T& element) { //添加的时候入栈1 stack1.push(element); } template<typename T> T CQueue<T>::deleteHead() { //删除的时候先判断栈2是否为空 if(stack2.size()<=0) { //栈2为空的时候先将栈1的元素压入栈2 while(stack1.size()>0) { T & data=stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size()==0) { throw new exception("queue is empty"); } //从栈2的栈顶开始出栈 T head=stack2.top(); stack2.pop(); return head; }
Java:
public class QueueTest { public static void main(String[] args){ Queue<Integer> queue=new Queue<Integer>(); queue.push(1); queue.push(2); queue.push(3); Integer result=queue.pop(); System.out.println(result); } public static class Queue<T> { private Stack<T> stack1=new Stack<T>(); private Stack<T> stack2=new Stack<T>(); //添加元素 public void push(T item) { stack1.push(item); } public T pop() { T item=null; //如果栈2为空 if(stack2.empty()) { //如果栈1不为空,先将栈1的元素压入栈2 while(!stack1.empty()) { item=stack1.pop(); stack2.push(item); } } //如果栈2不为空,将栈顶元素删除 if(!stack2.empty()) { item=stack2.pop(); } else { System.out.println("栈为空!不能再删除!"); } return item; } } }
相关文章推荐
- 软件框架详解
- 黑马程序员-面向对象三大特性之封装
- 程序员的量化交易之路(11)--命令参数解析库JCommonder学习
- C#/WPF 面试题(Microsoft, Morgan stanley)
- 程序员面试题精选算法58题加答案
- 面试题6:重建二叉树
- C#/WPF面试题 (Epan, Citi)
- 面试题12: 打印1到最大的n位数(递归解法,全排列的递归解法)
- 黑马程序员-23种设计模式之单例模式
- 面试题5:打印链表的值
- 如何留住烂程序员
- 面试总结
- 奇葩面试题
- 程序员 私活 经验 外包
- 面试题12: 打印1到最大的n位数v
- 黑马程序员--正则表达式知识点总结
- 面试题4:替换空格 和清除空格
- IOS面试问题总结
- 黑马程序员-java中的String
- 程序员的开发项目总是半途而废