20162302 队列加分项
主要内容:
一、补全课上代码,用实现循环队列
二、循环队列打印杨辉三角
三、单步跟踪排队情况,画出队列变化图
一、补全课上代码,用实现循环队列
这个项目的主要目的是使用循环队列打印出杨辉三角形,所以首先要构建循环队列
使用数组实现时,循环队列比线性队列要节省很多空间
课本上也给出了部分代码
相对于链表而言,循环数组的
first()
相对复杂,要考虑到front
指针指向数组长度之外的位置(比如数组长度为10,指针指向11)的情况:
- 如果是直接引用
queue[front]
指向的对象会出现空指针
public T first() {
return queue[front];
}
- 所以就要在
front
上做一些手脚
public T first() {
return queue[front % queue.length];
}
- 在
dequeue()
中引用front
的时候也要使用这种操作
public T dequeue() {
if (count == 0)
return null;
else {
T data = queue[front% queue.length];
queue[front% queue.length] = null;
front++;
count--;
return data;
}
}
其余部分都和栈的构建方式差不多,这里就不赘述了。
二、循环队列打印杨辉三角
PPT上有关于杨辉三角算法流程的程序框图
- 首先输入数据0,1,0
triangle.enqueue(0);
triangle.enqueue(1);
triangle.enqueue(0);
- 将队列前面的两个数字相加并放到队列末尾并弹出首位
s = (Integer) triangle.first();
triangle.dequeue();
e = s + (Integer) triangle.first();
System.out.print(e + " ");
triangle.enqueue(e);
- 通过一个
for循环
可以根据条件打印出杨辉三角形的一行
for (int i = 0; i < j; i++) {}
triangle.enqueue(0);
- 最后再使用一个
for循环
循环出阶数就可以实现杨辉三角形的打印了。可以在前面叫上Scanner
来让用户决定输出的行数。
public class PascalTriangle {
public static void main(String[] args) {
CircularArrayQueue triangle = new CircularArrayQueue();
Scanner scan = new Scanner(System.in);
System.out.print("输入杨辉三角形的阶数:");
int h = scan.nextInt();
Integer s;
Integer e;
triangle.enqueue(0);
triangle.enqueue(1);
triangle.enqueue(0);
System.out.println("1");
for (int j = 2; j <= h; j ++) {
for (int i = 0; i < j; i++) {
s = (Integer) triangle.first();
triangle.dequeue();
e = s + (Integer) triangle.first();
System.out.print(e + " ");
triangle.enqueue(e);
}
triangle.enqueue(0);
System.out.println();
}
}
}
三、单步跟踪排队情况,画出队列变化图
断点设置
- 将断点放在数据增加和减少的地方可以观察队列变化的情况
单步跟踪
- 初始值为0,1,0
循环以下步骤
- 弹出队列头部
- 求和并添加到队列尾
统计到Excel表格