导论
算法的特征:有穷性(finiteness),确定性(definiteness),输入,输出,有效性/可行性(effectiveness)
O表示法表示的是当N->某一值或者无穷大时,斜率的变化。重要的是曲线的形状,而不是具体的曲线的值,因为曲线的值可以通过常数C来变化。
大O表示法:用一个常数倍的简单函数,包裹住T(N),由此来表示“上界”
大
Ω
\Omega
Ω表示法:下界
大
Θ
\Theta
Θ表示法:既是上界也是下界
小o表示法:严格上届(严格大于)
线性表
用链表表示的时候,一定要记住**添加判断:是否为最后一个节点?是否可能遇到NULL->某个域**!!!!!
栈(Stack)
LIFO,后进先出。
Error check must be done before Push or Pop (Top).
这里写代码的时候一定要先判断 S==NULL 或 S!=NULL 。(Stack S)
注意防止**尾递归**!!!
void PrintList ( List L )
{
if ( L != NULL ) {
PrintElement ( L->Element );
PrintList( L->next );
}
} /* a bad use of recursion */
//编译器会自动改为如下:
void PrintList ( List L )
{
top: if ( L != NULL ) {
PrintElement ( L->Element );
L = L->next;
goto top; /* do NOT do this */
}
} /* compiler removes recursion */
//递归一定可以是被消除的。非递归运行速度快。但是递归易懂。
用栈实现中后缀表达式转换求值思路:
一个栈存数,一个栈存符号。数一个一个读入。存符号的栈操作顺序:读入一个新符号,判断栈顶元素优先级是否大于**等于**读入的新符号(注意如果栈顶为-,新读入为+,也要弹栈),如果大于等于,则弹栈(符号和数),这一步操作通过while,一直到栈顶元素优先级小于新读入元素。
注意左括号入栈前优先级最高,入栈后优先级最低,当且仅当读入右括号,否则不弹栈。
注意^运算符的运算顺序是从右到左:
223 ( 2 2 3 2^{2^3} 223) must be converted to 2 2 3 ^ ^, not 2 2 ^ 3 ^ since exponentiation associates right to left.
队列(Queue)
FIFO,先进先出。
-
front指向队头(dequeue方向)
-
rear指向队尾(enqueue方向)
“循环队列”