线性表
线性表的顺序表示和实现
线性表的顺序表示指的是用一组地址连续的存储空间一次存储线性表的数据元素。(连续空间、静态链表)
顺序存储
通常都用数组来描述数据结构中的顺序存储结构。定义如下:
typedef struct{
ElemType *elem; //存储空间基址;
int legth; //当前长度;空表长度
int listsize; //当前分配存储容量;
}SqList;
1.构造线性表
构造空的线性表,初始化线性表。
status InitList_Sq(SqList &L){
L.elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return ok;
}
2. 插入
在线性表的第i-1个元素和第i个元素之间插入一个元素b。线性表由(a1,a2…….ai-1,ai,…..an)n个元素变成了(a1,a2…….ai-1,b,ai,…..an)n+1个元素。插入元素b后,后面ai到an个元素顺序后移。
3. 删除
和插入相似,删除元素后,后续的元素顺序前移一个位置。
线性表链式表示
线性链表
线性表的单链表存储结构
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode, *LinkList;
1. 简单的删除、插入
2. 逆向建立链表
以前遇到的元素都是正向输入,如果现在给一串逆向输入的数据。比如以前给出1、2、3、4,以此建立正向链表。现在给出4、3、2、1,要求建立一个1、2、3、4顺序的链表。这样就需要逆向建立链表,最后在建立一个头。
3. 链表的归并
如果两个链表是有序的,那么可以在n的时间复杂度内,原地合并。
静态链表
静态链表的存储结构如下:
typedef struct {
ElemType data;
int cur;
}component,SLinkList[MAXSIZE];
每个链表可以看成一个二维的数组,每个元素物理上相邻,但是逻辑上并不一定相邻。这就是和顺序表的区别。所以这里需要存储每个元素的逻辑位置。
循环链表
它的特点是表中最后一个节点的指针域指向头结点,整个链表形成一个环。
双向链表
一元多项式的表示及相加
栈和队列
栈
顺序栈,利用一组地址连续的存储单元依次存储自栈底到栈顶的元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
数制转换
例如:(1348)十 = (2504)八
void conversion(){
InitStack();
scanf("%d", &N);
while(N){
push(N%8);
N /= 8;
}
while(!StackEmpty()){
Pop(S,e);
printf("%d",e);
}
}`
括号匹配检验
迷宫求解
bfs宽度搜索,一般用队列
表达式求值
例如求下面表达式的值:
4+2*3-10/5
算术四则运算的规则:
1. 先乘除、后加减
2. 从左算到右
3. 先括号内,后括号外
算法如下:
- 先定义算术符的优先级关系: # < ( < - = + < * = / < )
- 定义两个栈, 一个为操作数栈,一个为运算符栈
- 从表达式左边扫描到右边,如果是操作数,直接加入操作数栈。如果是运算符,用它和栈顶元素比较,如果小于等于栈顶元素优先级,那么弹出栈顶算符,一次弹出操作数栈两个操作数(栈顶作为被操作数),两者进行运算,结果再压入操作数栈。直到该运算符大于运算符栈栈顶元素(可能为#),此时压入栈。
队列
普通队列
可以用连续的存储空间
链队列
链表实现的队列。
循环队列
初始化建空队列时,令front = rear = 0,每当插入新的队列队尾元素时,尾指针增1,每当删除队头元素时,头指针曾1。如果(rear+1)% MAXQSIZE = front,那么表示队列已满。