数据结构第三四章 知识点总结.docx
《数据结构第三四章 知识点总结.docx》由会员分享,可在线阅读,更多相关《数据结构第三四章 知识点总结.docx(8页珍藏版)》请在冰豆网上搜索。
![数据结构第三四章 知识点总结.docx](https://file1.bdocx.com/fileroot1/2022-11/30/45d01b73-c83d-4e32-afa1-f50af6821dc9/45d01b73-c83d-4e32-afa1-f50af6821dc91.gif)
数据结构第三四章知识点总结
第三章栈
1、栈的特点是什么?
栈和线性表的区别是什么?
答:
只允许在线性表的同一端进行插入和删除的线性表。
做插入和删除那一端叫做栈顶,不能做插入和删除的那一端叫做栈底。
线性表则是只要是合法的位置都可以做插入和删除。
2、先进后出(FILO,FirstInLastOut)或后进先出(LIFO)
3、如果入栈的顺序为ABC,则出栈的顺序可以为ABC,ACB,BAC,BCA,CBA,CAB等。
4、顺序栈:
顺序存储结构的栈称为顺序栈。
链栈:
链式存储结构栈称为链栈。
5、顺序栈的语言描述(静态)
#defineStackSize100
typedefcharDataType;
typedefstruct
{DataTypedata[StackSize];
inttop;
}SeqStack;
SqStacksq;
6、动态语言描述(教材):
typedefstruct
{selemtype*base;
selemtype*top;
intstacksize;
}SqStack;
SqStacksq;
sq.base=(selemtype*)malloc(Maxsize*sizeof(selemtype));
sq.top=sq.base;
7、静态和动态下的栈空、入栈、出栈、读栈顶元素、栈满的操作如下所示:
8、顺序栈静态运算的实现
1、置空栈
voidInitStack(SeqStack*S)
{
S->top=-1;
}
2、判栈空
intStackEmpty(SeqStack*S)
{
returnS->top==-1;
}
3、判栈满
intStackFull(SeqStack*S)
{
returnS->top==StackSize-1;
}
4、进栈
voidPush(SeqStack*S,DataTypex)
{
if(StackFull(S));//判栈满
Error("Stackoverflow");
S->top++;//栈顶变化
S->data[s->top]=x;
}
5、退栈
DatadTypePop(Seqstack*S)
{
if(StackEmpty(S));//判栈空
Error("Stackunderflow");
x=S->data[S->top];//删除
S->top--;//栈顶变化
return(x);
}
9、顺序栈动态运算的实现
课本P47看会。
队列
一、队列的特点?
先进后出
队列和栈的区别?
线性表的特点?
栈的特点?
先进先出
答:
队列指的是一端做插入(队尾),另一端做删除(队头)。
二、如果入队顺序为ABC,则出队顺序只能是ABC
如果入栈为ABC,,则出栈顺序可以有ABC,BAC,CBA,ACB等。
三、队列可以采取顺序存储(顺序队)和链式存储(链队)
四、顺序队的静态实现
1.结构体语言描述
#defineM100
typedefstructqueue
defineMAXSIZE1024/*队列的最大容量*/
typedefstruct
{datatypedata[MAXSIZE];/*队员的存储空间*/
intrear,front;/*队头队尾指针*/
}SeQueue;
定义一个指向队的指针变量:
SeQueue*sq;
2.静态实现的基本操作
①队列的数据区为:
sq->data[0]---sq->data[MAXSIZE-1]
②队头:
sq->front
③队尾:
sq->rear
④置空队则为:
sq->front=sq->rear=-1;
⑤在不考虑溢出的情况下,入队操作:
sq->rear++;
sq->data[sq->rear]=x;
⑥在不考虑队空的情况下,出队操作:
sq->front++;
x=sq->data[sq->front];
⑦队中元素的个数:
m=(sq->rear)-(q->front);
⑧队满时:
m=MAXSIZE;
⑨队空时:
m=0。
注意:
通过上图可以看到会出现假溢出现象,所以提出了循环队列。
3.什么是循环队列?
循环队列中rear和front操作要会。
4.循环队列的语言描述,这个实际上和前面的顺序队的语言描述一样
语言描述:
typedefstruct
{datatypedata[m];
intfront;intrear;
intcount;//统计队列中元素点数
}cirqueue;
cirqueue*q
5.循环队列的基本操作
1、置空队列
Voidinitqueue(cirqueue*q)
{q->front=q->rear=0;
q->count=0;
}
2、判空
intqueueempty(cirqueue*q)
{if(q->count==0)return
(1);
elsereturn(0);
}
3、判队满
intqueuefull(cirqueue*q)
{
retuenq->count=maxsize;
}
4、入队
voidenqueue(cirqueue*q,datatypex)
{if(q->count==m)//判队满
{printf(“overflow“);exit(0);}
q->data[q->rear]=x;
q->rear=(q->rear+1)%M;
q->count++;
}
5、出队
datatypedequeue(cirqueue*q)
{if(q->count==0)//判队空
{printf(“queuenull“);exit(0);}
Temp=q->data[q->font]
q->count--;
q->front=(q->front+1)%m;//删除队头元素
}
6、取队头元素
datatypegetqueue(cirqueue*q)
{
if(q->count==0)
{printf(“queuenull“);exit(0);}
returnq->data[q->font];
}
五、循环队列的动态语言描述以及基本操作课本P64-65
里面的每条语句都要明白其含义,尤其是算法中的if条件表达的含义要会。
1.初始化:
Q.front=Q.rear=0(不一定非从0位置开始,可以在循环队列的任意位置都可以)
2.判空:
Q.front==Q.rear
3.判满:
(Q.rear+1)%maxsize==Q.front(书中浪费一个单元格表示队列满)
4.求循环队列中元素的个数:
(Q.rear-Q.front+maxsize)%maxsize
六、小结
1、循环队列的引出:
假溢出。
2、循环的条件
q->front=(q->front+1)%m出队
q->rear=(q->rear+1)%m入队
3、队空判断条件
q->count=0或q->rear==q->front
4、队满判断条件
q->count=m或
(q->rear+1)%M==q->font
七、链队
指的是在单链表的首结点上做删除,在尾结点上做插入。
八、理解顺序表、顺序栈、顺序队的区别?
理解链表、链栈、链队的区别?
顺序表:
可以在任意合法的位置上做插入和删除。
顺序栈:
只可以在顺序表的同一端上做插入和删除。
顺序队:
在顺序表的一端做插入,另一端做删除。
链表:
可以在任意合法的位置上做插入和删除。
链栈:
只可以在链表的首结点位置做插入和删除。
链队:
在链表的首结点位置做删除,尾结点后做插入。
第四章串(了解)
串长不包括/n。
串可以顺序存储,也可以链式存储。
模式匹配(BF算法和KMP算法)