堆栈和队列(阅读代码)

时间:2014-04-25 21:33:05

标签: java stack queue

我想解决这个问题,而不是把它放到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?因为6的s.substring()将是(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)。

假设执行了(堆栈)推送和弹出操作的混合序列。推动按顺序推动整数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)。

2 个答案:

答案 0 :(得分:3)

问题3)

看看b)

4 6 8 7 5 3 2 9 0 1

当它弹出并打印9时,表示所有推动操作在该点完成 (由于推动0,1,...,9的顺序)。好的,现在它正在读9.然后它正在读0,
这意味着它正在读取第一个被推入堆栈的数字 然后,它无法弹出并打印1,因为它已经弹出了最后一个 可能的数字(因为如上所述,在弹出0之后没有方法1被按下 所有推送操作都是在弹出的时候完成的。)

你需要使用类似的逻辑观察来看看为什么f)和g)也是不可能的 当阅读所有这些弹出数字序列时,试着想象一下序列
在弹出之间发生的推动(即自上一次弹出后被推动的内容) 无论哪一系列的流行音乐导致打嗝:一个是不可能的,即不可能发生。

问题2) 这个是微不足道的,除了a)之外的任何东西都是不可能的。对吗?
因为与商店中的队列一样,客户服务于 他们来到收银台的顺序。否则它不会是一个队列。

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

答案 1 :(得分:0)

问题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'不会发生。如果我错了,请纠正我。