数据结构与算法
算法的5个基本特性:输入、输出、有穷性、确定性和可行性
算法的时间复杂度 T=O(f(n))
空间复杂度 S(n)=O(f(n)) 存储空间的实现
线性表:
(List)零个或多个数据元素的有限序列
顺序存储结构:连续的存储单元
#define MAXSIZE 20
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int length;
}SqList;
链式存储结构
单链表
静态链表
#define MAXSIZE 1000
typedef struct
{
ElemType data;
int cur;
}Component,StaticLinkList[MAXSIZE];
数组第一个元素的cur用来存放备用链表的第一个结点下标
最后一个元素的cur用来存放第一个插入元素的下标,相当于头结点
循环链表
有头指针的
p->next 不等于头结点,则循环未结束
不用头指针的,用终端结点的尾指针表示循环链表
rear->next->next即为开始结点
rear->next是保存头结点的结点
双向链表
typedef struct DulNode
{
ElemType data;
struct DulNode *prior;
struct DulNode *next;
}DulNode, *DuLinkList;
栈与队列
栈是限定仅在表尾(栈顶top)进行查寻和删除操作的线性表。先进后出
队列是只允许在一端进行插入操作、而在另一端进行删除操作的线性表。先进先出
栈顶top
栈底bottom
Last in first out
简称LIFO
栈的顺序存储:
栈的结构定义
typedef int ElemType;
typedef struct
{
ElemType data[MAXSIZE];
int top;
}SqStack;
两栈共享空间结构(两个相同数据类型的栈)
typedef struct
{
ElemType data[MAXSIZE];
int top1;
int top2;
}SqDoubleStack;
当top1+1==top;时为栈满
我们还需要一个判断是栈1还是栈2的栈号参数stackNumber。
栈的链式存储:(链栈)
链栈的结构
栈的应用–递归
斐波那契数列
int Fbi(int i)
{
if(i<2)
return i = = 0 ? 0 : 1;
return Fbi(i-1)+Fbi(i-2);
}
四则运算表达式求值
中缀表达式转后缀表达式
规则:从左到右遍历中缀表达式的每个数字和符号,若是数字就输出,即成为后缀表达式的一部分;
若是符号,则判断其与栈顶符号的优先级,是右括号或优先级低于栈顶符号则栈顶元素依次出栈并输出,并将当前符号进栈
一直到输出后缀表达式为止。
队列 first in first out 简称FIFO
允许插入的一端为队尾,允许删除的一端为队头front
rear指针指向队尾元素的下一个位置)
front指针指向队头元素
当front= =rear时为空队列
循环队列
如何判断空、满
设置一个标志变量flag
当front= =rear&&flag= =0时队列为空
当front= =rear&&flag= =1时队列为满
方法二
保留最后一个空间
当front = =rear ,为空
当(rear+1)%QueueSize = = front ,为满
计算队列长队公式:
(rear - front +QueueSize)%QueueSize
循环队列的顺序存储结构
typedef struct
{
ElemType data[MAXSIZE];
int front;
int rear;
}SqQueue;
初始化InitQueue
长度 QueueLength
入队
Status EnQueue (SqQueue *Q,ElemType e)
{
if((Q->rear+1)%MAXSIZE == Q->front)
return ERROR;
Q->data[Q-rear]=e;
Q->rear =(Q->rear +1)%MAXSIZE;
return OK;
}
//出队
Status DeQueue (SqQueue *Q,ElemType *e)
{
if(Q->front == Q->rear)
return ERROR;
*e=Q->data[Q->front];
Q->front=(Q->front+1)%MAXSIZE;
return OK;
}
以上为顺序存储
队列的链式存储结构
typedef int ElemType;
//结点结构
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
//队列链表结构
typedef struct
{
QueuePtr front ,rear;
}LinkQueue;
串(P149)
KMP模式匹配算法(P159)
树(Tree)