算法学习--队列初探

第二章学习了 队列

简述

之前使用队列使用很多,但是没有很多的学习过队列里面的实现原理,和头指针,尾指针的问题。
这次学习这本书,觉得剖析了很多原来不想去想的问题(不知道是不是我一个人,遇到什么指针啊什么的就头疼,特别不喜欢带这个词的),不过经过了今天真的明白了,这个有多好啊!

粗浅的明白队列包含以下几部分:

  • 队列元素 实际明白后 其实就是一个数组
  • 队列的头指针
  • 队列的尾指针
判断队列的长度 无非就是头指针和尾指针之间的差距 
如果头指针的指向和尾指针相同代表长度为0;

一点小感悟

学习的时候从一开始没有用到头尾指针,纯靠自己瞎写,到后来学会用头尾指针,到最后的进行优化,感觉确实对编程的基本功有所提升,至少慢慢补上心理的一些害怕的地方,代码越写感觉越简单明了

代码

第一个自己写的

private static void caculateNumber(int[] qqNumber) {
int start = 0;
int tail = qqNumber.length;
while (tail >= 1) {
System.out.print(qqNumber[start] + ” , “);
if (tail == 1) {
return;
}
// 获取第二个元素,防止被往前替换的时候删除
int tailNum = qqNumber[start + 1];
// 进行替换!
for (int j = 0; j < tail - 2; j++) {
qqNumber[j] = qqNumber[j + 2];
}
// 末尾添加 尾部数据
qqNumber[tail - 2] = tailNum;
System.out.println(Arrays.toString(qqNumber));
// 长度减少一个
tail -= 1;
}
}

写这个代码的时候真是脑子里面没有一个指针的概念,就是想说从头开始从尾开始进行写,然后还自己进行删除啥的操作。

看书以后的

public static void caculateQueue(int[] qqNumber){
int head = 0;
int tail = 9; // 这里没有减一的操作是因为想通过这个进行判断,如果head == tail 说明为null
// 如果头和尾不相等的时候进行判断排序
while(head < tail){
// 打印第一个
System.out.println(qqNumber[head] +” , “);
// 头指针后移
head++;
// 将此数 设置到末尾
qqNumber[tail] = qqNumber[head];
// 尾指针后移
tail++;
// 头指针后移
head++;
}
}

有点指针的印象在脑子里面了! 但是书里面的数组长度有很多的浪费,然后进行一番思考!

public static void caculateNumberAgain(int[] qqNumber) {
int head = 0; // 定义头指针
int tail = qqNumber.length - 1; // 定义尾指针
// 我们需要一个很长的数组 这个数组的长度应该是 > 当前数组长度的一半那么长
// int length = (int)(Math.log(tail) / Math.log(2)) + 1; // 这个想法错误了有问题,并不是几次幂,而是有几个2就要比几次
int length = getQQNumberLength(qqNumber);
System.out.println(“创建缓冲区长度为 ” + length);
int[] bufferArray = new int[length + 1]; // 这里存在的问题涉及到 叠加的问题 先用 100 代替
// 将所有的内容放入到 当前这个缓冲区里面
for (int i = head; i <= tail; i++) {
bufferArray[i] = qqNumber[i];
}
// 逻辑为 获取第一个数字 然后 将第二个数字加入到尾部
// 如果还没有到队尾这个时候进行打印
while (head <= tail) {
// 第一步 打印出第一个数字
System.out.print(bufferArray[head] + ” , “);
// 第二部将数字放到队尾
bufferArray[tail + 1] = bufferArray[head + 1];
// 头指针后移两位
head += 2;
// 尾指针后移1位
tail += 1;
System.out.println(Arrays.toString(bufferArray) + ” = ” + bufferArray.length);
}
return;
}

private static int getQQNumberLength(int[] qqNumber) {
int length = qqNumber.length;
int bufferLength = length;
while (length >= 2) { // 长度为2的时候还可以比一次
bufferLength += 1;
length = length - 1;
}
return bufferLength;
}

哈哈! 是不是有点乱,但是这个节省了 空间!

收获与思考

学习了两天后,感觉这基础真的很重要啊! 感觉我要是面试我肯定也要考这些东西! 哈哈哈哈! 慢慢补把! 每天都进步一点! 加油!

你可能感兴趣的:(算法)