两个栈实现队列与两个队列实现栈
来源:互联网 发布:warframe淘宝买装备 编辑:程序博客网 时间:2024/05/21 11:30
已知下面Stack类及其3个方法Push、Pop和 Count,请用2个Stack实现Queue类的入队(Enqueue)出队(Dequeue)方法。
class Stack
{
public:
void Push(int x); // Push an element in stack;
int Pop(); // Pop an element out of stack;
int Count() const; // Return the number of the elements in stack;
};
class Queue
{
public:
void Enqueue(int x);
int Dequeue();
private:
Stack s1;
Stack s2;
};
分析:思路一:
始终维护s1作为存储空间,以s2作为临时缓冲区。
入队时,将元素压入s1。
出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒回”s1。
见下面示意图:
但有一个细节是可以优化一下的。即:在出队时,将s1的元素逐个“倒入”s2时,原在s1栈底的元素,不用“倒入”s2(即只“倒”s1.Count()-1个),可直接弹出作为出队元素返回。这样可以减少一次压栈的操作。
思路二:
入队时,先判断s1是否为空,如不为空,说明所有元素都在s1,此时将入队元素直接压入s1;如为空,要将s2的元素逐个“倒回”s1,再压入入队元素。
出队时,先判断s2是否为空,如不为空,直接弹出s2的顶元素并出队;如为空,将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
相对于第一种方法,变种的s2好像比较“懒”,每次出队后,并不将元素“倒回”s1,如果赶上下次还是出队操作,效率会高一些,但下次如果是入队操作,效率不如第一种方法。
思路三:
入队时,将元素压入s1。
出队时,判断s2是否为空,如不为空,则直接弹出顶元素;如为空,则将s1的元素逐个“倒入”s2,把最后一个元素弹出并出队。
这个思路,避免了反复“倒”栈,仅在需要时才“倒”一次。但在实际面试中很少有人说出,可能是时间较少的缘故吧。
以上几个思路乍看没什么问题了,但其实还是有个细节要考虑的。其实无论什么方法和情况,都要考虑没有元素可供出队时的处理(2个栈都为空的时候,出队操作一定会引起异常)代码如下 :
在处理返回值时 ,犯了一个错误,若果返回值时int则不能返回null,因为int不是对象,而Integer就可以,泛型化的返回值都可以但会null,因为基本类型传递给泛型必须用包装的类,泛型参数都是对象。
public class Queue {private Stack<Integer> enStack=new Stack<Integer>();private Stack<Integer> deStack=new Stack<Integer>();public int size;public void enqueue(int e){if(enStack.isEmpty()){while(!deStack.isEmpty())enStack.push(deStack.pop());}enStack.push(e);size++;}public int dequeue(){int temp;if(size==0)return -1000;if(deStack.isEmpty()){while(enStack.size()!=1)deStack.push(enStack.pop());temp=enStack.pop();}elsetemp= deStack.pop();size--;return temp;}public static void main(String args[]){ Queue q=new Queue();// q.enqueue(1);// q.enqueue(2);// q.enqueue(3);// q.enqueue(4); System.out.println(q.size+""); System.out.println(q.dequeue()+""); q.enqueue(5); System.out.println(q.size+"");}
2.两个队列实现一个栈
当单向的来用就行,设有两个队列A和B,栈的push操作,直接push到A的队尾就行了。栈的pop操作时,将A中的队列依次取出放到B中,取到最后一个时,最后一个不要放到B中,直接删掉,再将B中的值依次放回A中。栈的top操作时,将A中的队列依次取出放到B中,取到最后一个时,将最后一个值记录下来,再将最后一个值放到B中,再将B中的值依次放回到A中。
- 两个栈实现队列与两个队列实现栈
- 两个栈实现队列与两个队列实现栈
- 两个栈实现队列与两个队列实现栈
- 两个栈实现队列
- 两个队列实现栈
- 两个栈实现队列
- 两个栈实现队列
- 两个栈实现队列
- 两个队列实现栈
- 两个栈实现队列
- 两个 栈 实现队列
- 两个栈实现队列
- 两个队列实现栈
- 两个栈实现队列
- 两个栈实现队列
- 两个队列实现栈
- 两个栈实现队列
- 两个栈实现队列
- 3.struts中的注解
- Yii 面包屑制作
- xdebug 安装
- 性能调优攻略
- 第十周项目2-M$pszi$y是嘛意思?
- 两个栈实现队列与两个队列实现栈
- 程序员必看的书
- 使用Batik操作SVG
- window下使用libxml2读取xml文件
- java 内存区域
- vim 使用笔记
- 自己总结的Spring 的一些知识,Spring IOC,MVC
- LINUX Win7下Vmware虚拟机共享上网设置
- 页面切换的js事件