两个栈实现队列与两个队列实现栈

来源:互联网 发布:warframe淘宝买装备 编辑:程序博客网 时间:2024/05/21 11:30
     1.   用两个栈(Stack)实现一个队列(Queue)。

已知下面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。

见下面示意图:

 

2Stacks1Queue

 

但有一个细节是可以优化一下的。即:在出队时,将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中。


0 0
原创粉丝点击