我想解决这个问题,而不是把它放到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)。
答案 0 :(得分:3)
看看b)
4 6 8 7 5 3 2 9 0 1
当它弹出并打印9时,表示所有推动操作在该点完成
(由于推动0,1,...,9的顺序)。好的,现在它正在读9.然后它正在读0,
这意味着它正在读取第一个被推入堆栈的数字
然后,它无法弹出并打印1,因为它已经弹出了最后一个
可能的数字(因为如上所述,在弹出0之后没有方法1被按下
所有推送操作都是在弹出的时候完成的。)
你需要使用类似的逻辑观察来看看为什么f)和g)也是不可能的
当阅读所有这些弹出数字序列时,试着想象一下序列
在弹出之间发生的推动(即自上一次弹出后被推动的内容)
无论哪一系列的流行音乐导致打嗝:一个是不可能的,即不可能发生。
答案 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'不会发生。如果我错了,请纠正我。