漫画:如何用栈实现队列?

640?wx_fmt=gif

640?wx_fmt=jpeg

640?wx_fmt=jpeg

—————  第二天  —————

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

————————————

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

栈的特点是先入后出,出入元素都是在同一端(栈顶):

入栈:

640?wx_fmt=png

出栈:

640?wx_fmt=png

队列的特点是先入先出,出入元素是在不同的两端(队头和队尾):

入队:

640?wx_fmt=png

出队:

640?wx_fmt=png

既然我们拥有两个栈,那么我们可以让其中一个栈作为队列的入口,负责插入新元素;另一个栈作为队列的出口,负责移除老元素。

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

队列的主要操作无非有两个:入队和出队。

在模拟入队操作时,每一个新元素都被压入到栈 A 当中。

让元素 1 “入队”:

640?wx_fmt=png

640?wx_fmt=png

让元素 2 “入队”:

640?wx_fmt=png

640?wx_fmt=png

让元素 3 “入队”:

640?wx_fmt=png

640?wx_fmt=png

这时候,我们希望最先“入队”的元素 1 “出队”,需要怎么做呢?

让栈 A 中的所有元素按顺序出栈,再按照出栈顺序压入栈 B。这样一来,元素从栈 A 弹出并压入栈 B 的顺序是 3,2,1,和当初进入栈 A 的顺序 1,2,3 是相反的:

640?wx_fmt=png

此时让元素 1 “出队”,也就是让元素 1 从栈 B 弹出:

640?wx_fmt=png

让元素 2 “出队”:

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

让元素 4 “入队”:

640?wx_fmt=png

640?wx_fmt=png

此时的出队操作仍然从栈 B 弹出元素。

让元素 3 “出队”:

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

让元素 4 “出队”:

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

  1. private Stack<Integer> stackA = new Stack<Integer>();

  2. private Stack<Integer> stackB = new Stack<Integer>();




  3. /**

  4. * 入队操作

  5. * @param element  入队的元素

  6. */

  7. public void enQueue(int element) {

  8.    stackA.push(element);

  9. }




  10. /**

  11. * 出队操作

  12. */

  13. public Integer deQueue() {

  14.    if(stackB.isEmpty()){

  15.        if(stackA.isEmpty()){

  16.            return null;

  17.        }

  18.        transfer();

  19.    }

  20.    return stackB.pop();

  21. }




  22. /**

  23. * 栈A元素转移到栈B

  24. */

  25. private void transfer(){

  26.    while (!stackA.isEmpty()){

  27.        stackB.push(stackA.pop());

  28.    }

  29. }




  30. public static void main(String[] args) throws Exception {

  31.    StackQueue stackQueue = new StackQueue();

  32.    stackQueue.enQueue(1);

  33.    stackQueue.enQueue(2);

  34.    stackQueue.enQueue(3);

  35.    System.out.println(stackQueue.deQueue());

  36.    System.out.println(stackQueue.deQueue());

  37.    stackQueue.enQueue(4);

  38.    System.out.println(stackQueue.deQueue());

  39.    System.out.println(stackQueue.deQueue());

  40. }

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

声明:本文为作者投稿,首发于个人公众号程序员小灰,版权归其所有。



 热 文 推 荐 


☞ CSDN 创始人蒋涛:AI 定义的开发者时代

☞ 你真的知道如何在 GitHub 上高效搜索开源项目吗?

☞ 程序员不努力,和咸鱼有什么分别?

“对不起,你的离职是我的错!”

 Gartner的预言:通向混合IT之旅

☞ 阿里“菜鸟”AI?

☞ 刚刚!华为又被美国盯上了!

☞ 心疼!能为程序员男友做些什么吗?

640?wx_fmt=gif

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!");
cout << "点个好看吧!" << endl;
Console.WriteLine("点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!")
echo "点个好看吧!"

640?wx_fmt=gif点击“阅读原文”,打开 CSDN App 阅读更贴心!

640?wx_fmt=png喜欢就点击“好看”吧
展开阅读全文

没有更多推荐了,返回首页