#define 中不能嵌套其他预编译代码
例:
#define ABC #pragma message("aaa")
int main()
{
//#pragma message("aaa") //这样是可以的
ABC //这样就不行
return 0;
}
#pragma 是C语言预留给具体编译器厂商 扩展预编译功能用的
题目:实现一个袖珍型计算器,假设已经从界面编辑框读入两个数op1和op2,和一个操作符per(+,-,*,/),可以用switch来实现,代码如下:
switch(per)
{
case ADD:
result = add(op1,op2);
break;
case SUB:
result = sub(op1,op2);
break;
……
}
如果对于一个新奇的有上百个操作符的计算器,这个switch将会很长。有没有什么办法可以缩短这个代码量,看起来简洁明了呢?
第0步:
定义操作函数
int add(int p1, int p2)
{
return p1 + p2;
}
int sub(int p1, int p2)
{
return p1 - p2;
}
第一步
定义函数指针
typedef int(*pFunc)(int, int);
第二步
定义结构体
struct Operation
{
int op;
pFunc func;
};
第三步
定义操作列表
static struct Operation OpArray[] =
{
{ '+', add },
{ '-', sub },
};
第四步
定义run函数
int run(int op, int p1, int p2)
{
int ret = 0;
int i = 0;
for(i=0; i<sizeof(OpArray)/sizeof(*OpArray); i++)
{
if( OpArray[i].op == op )
{
ret = OpArray[i].func(p1, p2);
}
}
return ret;
}
考虑:如果你现在要增加一个新的操作乘法,你会如何修改上面的代码呢?
因为像我这样把代码写好后 以后无论多加多少操作 其实我只定义新的函数 和 在列表添加
这个两个动作 非常直观 所以基本不会影响之前写的代码
为什么静态链表结构体中要在定义个header成员,而不直接使用node[0]?
在静态链表中 我们把所有的空闲结点都用-1来标记 当插入一个元素的时候 我们需要遍历查找空闲结点 你想想 这样是不是有点低效了
所以一个想法就是把 所有的空闲结点也连接成一个链表 那么也就是说在同一段空间中 部分结点是静态链表存储了实际的数据元素 部分没有用的空闲结点连接成空闲链表
那么你想想 是不是我们需要两个表头来标识两个链表呢 因此我们把0元素空出来 当把0元素赋值为静态链表头的时候 从0开始访问的就是静态链表元素 当把0元素赋值为空闲链表头的时候 从0开始访问的就是空闲链表元素
这样子 如果我们插一个新元素时 直接从空闲链表中拿一个空间出来 存储新元素即可 这个方法从空间链表取空间的时间复杂度为O(1)
二叉树的存储方式是非线性存储,要改为线性存储( left 和 right 变成 pre 和 next )
由于需要线性存储 所以可以有三种方式 先序 后序 中序
然后将pre指向前驱,将next指向后继,所以说时间复杂度是O(n) 是肯定的
首先需要一个辅助空间 TreeNode* array[n];之后先序或者中序或者后序遍历这树 把位置存入array中,之后遍历整个辅助空间 把元素的left和right指向前后位置,最后释放这个辅助空间