数据结构第三四章 知识点总结.docx

上传人:b****4 文档编号:4419889 上传时间:2022-12-01 格式:DOCX 页数:8 大小:612.10KB
下载 相关 举报
数据结构第三四章 知识点总结.docx_第1页
第1页 / 共8页
数据结构第三四章 知识点总结.docx_第2页
第2页 / 共8页
数据结构第三四章 知识点总结.docx_第3页
第3页 / 共8页
数据结构第三四章 知识点总结.docx_第4页
第4页 / 共8页
数据结构第三四章 知识点总结.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

数据结构第三四章 知识点总结.docx

《数据结构第三四章 知识点总结.docx》由会员分享,可在线阅读,更多相关《数据结构第三四章 知识点总结.docx(8页珍藏版)》请在冰豆网上搜索。

数据结构第三四章 知识点总结.docx

数据结构第三四章知识点总结

第三章栈

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算法)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1