【问题标题】:Stack and Queue (reading code)堆栈和队列(阅读代码)
【发布时间】:2014-06-11 18:37:50
【问题描述】:

我想在不将其放入 Java IDE 的情况下解决此问题。 (如果在考试中出现,我将无法解决。)

所以到目前为止我所知道的。

我知道堆栈被称为 LIFO 队列称为FIFO。但我不明白这段代码会弹出什么(或者如果我是对的)。

 public static void main (String[] args) {
    Queue<String> q = new Queue<String> ();
    q.enqueue ("one");
    q.enqueue ("two");
    q.enqueue ("four");
    q.enqueue ("six");
    String s = "";
    int i = 0;
    while (!q.isEmpty()) {
      s = s + q.dequeue().substring(i);
      i++; 
    }
    StdOut.print (s);
  }

因为它是一个队列,所以它是 FIFO 并且子字符串将导致输出为: onewour?由于 s.substring() 表示 6 为 (3),所以不会出现任何值。

最后我在普林斯顿CS课上发现了两个问题,但不知道答案是怎么来的

假设客户端执行(队列)入队和出队操作的混合序列。入队操作将整数 0 到 9 按顺序放入队列中;出队操作打印出返回值。以下哪个序列不能发生?

(a)  0 1 2 3 4 5 6 7 8 9

(b)  4 6 8 7 5 3 2 9 0 1 

(c)  2 5 6 7 4 8 9 3 1 0

(d)  4 3 2 1 0 5 6 7 8 9

答案:(b)、(c) 和 (d)。

假设执行(堆栈)推入和弹出操作的混合序列。 push 按顺序推动整数 0 到 9; pops 打印出返回值。以下哪个序列不能发生?

(a)  4 3 2 1 0 9 8 7 6 5

(b)  4 6 8 7 5 3 2 9 0 1

(c)  2 5 6 7 4 8 9 3 1 0

(d)  4 3 2 1 0 5 6 7 8 9

(e)  1 2 3 4 5 6 9 8 7 0

(f)  0 4 6 5 3 8 1 7 2 9

(g)  1 4 7 9 8 6 5 3 0 2

(h)  2 1 4 3 6 5 8 7 9 0

答案:(b)、(f) 和 (g)。

【问题讨论】:

    标签: java stack queue


    【解决方案1】:

    问题 3)

    看b)

    4 6 8 7 5 3 2 9 0 1

    当它弹出并打印 9 时,表示此时所有推送操作都已完成
    (由于推送 0,1,...,9 的顺序)。好的,现在读数为 9。然后读数为 0,
    这意味着它正在读取第一个被压入堆栈的数字。
    那么它就不可能弹出并打印 1 因为它已经弹出了最后一个
    可能的数字(在弹出 0 后无法推送 1,因为如前所述
    所有推送操作都在弹出 9 时完成)。

    您需要使用类似的逻辑观察来了解为什么 f) 和 g) 也不可能。
    在阅读所有这些弹出数字序列时,请尝试想象序列
    在弹出之间发生的推送(即自上次弹出以来推送的内容)。
    无论哪种顺序的爆裂声都会导致打嗝:那是不可能的,即不可能发生。

    问题 2) 这是微不足道的,除了 a) 之外的任何事情都是不可能的。对吧?
    因为就像在商店里排队一样,顾客在
    他们来到收银台的顺序。否则它不会是一个队列。

    问题 1) 如果你真的输入这个,编译并运行它,你会学到更多。

    【讨论】:

    • 对于队列:那么只有一种方法,对吧?但我仍然遇到堆栈问题。订单是否无关紧要,因为订单是 push pop push...etc 对吗?
    • 不,顺序不是push,pop,push,pop等。可能是:push,push,push,push,pop,push,push,pop,pop等。含义,它不是一个交替的推送和弹出序列。正如问题文本所说:它是“(堆栈)推送和弹出操作的混合序列”。
    • 对于队列来说,入队、出队操作的顺序也不是交替的,还是混杂的。但是由于这种结构的性质,出队的序列只能给出一个结果:0、1、2、3、...、9。
    • 啊,谢谢你的详尽解释,对我帮助很大!
    【解决方案2】:

    问题 3) “按顺序对整数 0 到 9 进行混合推入和弹出操作” 我认为这意味着从 0 到 9 开始保持顺序。允许轮换。即:例如:按相同顺序推送8,9,0,1,2,有效。 否则选项“e”是不可能的。 此处的选项“g”也是可能的。 以下是您必须执行的操作才能获得选项“g”中给出的序列

    Stack r = new Stack(); 
    //Not providing the implementation details of stack here. 
    r.push(1);
    System.out.print(r.pop());
    r.push(2);
    r.push(3);
    r.push(4);
    System.out.print(r.pop());
    r.push(5);
    r.push(6);
    r.push(7);
    System.out.print(r.pop());
    r.push(8);
    r.push(9);
    System.out.print(r.pop());
    System.out.print(r.pop());
    System.out.print(r.pop());
    System.out.print(r.pop());
    System.out.print(r.pop());
    r.push(0);
    System.out.print(r.pop());
    System.out.print(r.pop());
    

    只有 'b' 和 'f' 不能出现。如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2018-05-30
      • 2014-07-21
      • 2015-11-16
      • 2019-03-07
      • 2021-04-29
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多