具体代码请看:NDKPractice项目的datastructure32queue
1. 汉诺塔:
如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,
期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数
步骤:
- n-1个盘子借助 C 从 A 挪动到 B 上面
- 直接把 n 盘子从 A 挪动到 C
- n-1 个盘子借助A 从 B 挪动到 C
1 | void hannuota(int n,char start,char help,char end){ |
打印结果:
1 | E/TAG: 把第 1 个盘子从 A 挪动到 C |
2. 位运算知识:
负数转二进制 = 原码的补码
原码:
一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码;10000000 00000000 00000000 00000101 是 -5的 原码。
反码:
正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 ;
负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。
称:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。
补码:
正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
3. 数组实现队列:
cap
可以乱传,以下代码,保证size 为 2 的 幂次
1 |
|
思想:head,和tail
用来标记队列的头尾,从尾部开始插入修改head,从尾部拿去修改tail
。
完整代码:
1 | template <class E> |