国嵌答疑 2013.8.14

#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指向前后位置,最后释放这个辅助空间

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值