剑指offer--两个栈实现一个队列

来源:互联网 发布:小程序连接数据库 编辑:程序博客网 时间:2024/05/13 00:47

题目:两个栈实现一个队列

分析:

方法一:

          s1是入栈的,s2是出栈的。
  • 入队列,直接压到s1是就行了
  • 出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中


缺点:有大量元素要push和pop,效率不高

方法二:

      s1表示入队的,s2表示出队列的,保证所有元素在一个栈中

  入队列:如果s1为空,把s2中所有的元素倒出压到s1中;否则直接压入s1

  出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素

   较方法一来说,减少了一写冗余

方法三:

       s1是入栈的,s2是出栈的。

  • 入队列:直接压入s1即可
  • 出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素

比较

    与实现二相比较,入队直接入即可,感觉此时已是最优。

void InQueue(stack* s1,stack* s2,int k){push(s1,k);}void OutQueue(stack* s1,stack* s2){if(IsEmpty(s2) == 1){while(IsEmpty(s1)== 0){push(s2,pop(s1));}}if(IsEmpty(s2) == 1){cout<<"Empty"<<endl;}return pop(s2);}

1 4
原创粉丝点击