数据结构C语言3.docx
- 文档编号:2808209
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:40
- 大小:273.06KB
数据结构C语言3.docx
《数据结构C语言3.docx》由会员分享,可在线阅读,更多相关《数据结构C语言3.docx(40页珍藏版)》请在冰豆网上搜索。
数据结构C语言3
第三章栈和队列
本章介绍的是栈和队列的逻辑结构定义及在两种存储结构(顺序存储结构和链式存储结构)上如何实现栈和队列的基本运算。
栈和队列:
⑴从数据结构角度:
操作受限的线性表——限定性的数据结构,其基本操作是线性表操作的子集;
⑵从数据类型角度:
与线性表不同的抽象数据类型(多型)。
两者的逻辑结构相同,但操作的种类和数目不同,用途大为不同。
本章的重点:
掌握栈和队列在两种存储结构上实现的基本运算;
难点:
循环队列中对边界条件的处理。
3.1栈
一、抽象数据类型栈的定义
栈(Stack):
限定仅在表尾进行插入或删除操作的线性表。
栈的表尾称为栈顶,表头称为栈底,不含元素的空表称为空栈。
假设栈S=(a1,a2,a3,…an),则a1称为栈底元素,an为栈顶元素。
栈中元素按a1,a2,a3,…an的次序进栈,退栈的第一个元素应为栈顶元素。
换句话说,栈的修改是按后进先出的原则进行的。
因此,栈称为后进先出的线性表(LastInFirstOut,LIFO)。
栈的抽象数据类型定义:
ADTStack{
数据对象:
D={ai|ai(-ElemSet,i=1,2,...,n,n>=0)
数据关:
R1={
基本操作:
InitStack(&S)构造一个空栈S
DestroyStack(&S)栈S存在则栈S被销毁
ClearStack(&S)栈S存在则清为空栈
StackEmpty(S)栈S存在则返回TRUE,否则FALSE
StackLength(S)栈S存在则返回S的元素个数,即栈的长度
GetTop(S,&e)栈S存在且非空则返回S的栈顶元素
Push(&S,e)栈S存在则插入元素e为新的栈顶元素——入栈
Pop(&S,&e)栈S存在且非空,则删除S的栈顶元素并用e返回其值——出栈
StackTraverse(S,visit())栈S存在且非空,则从栈底到栈顶依次对S的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
}ADTStack
二、栈的表示和实现
⒈顺序栈
由于栈是运算受限的线性表,因此线性表的存储结构对栈也适应。
利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
栈的顺序存储结构简称为顺序栈,它是运算受限的线性表。
因此,可用数组来实现顺序栈。
因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任何一个端点;栈顶位置是随着进栈和退栈操作而变化的,故需用一个整型变量top
例一叠书或一叠盘子。
要了解的是,在顺序栈中有"上溢"和"下溢"的概念。
顺序栈好比一个盒子,在里头放了一叠书,当要用书的话只能从第一本开始拿(把盒子翻过来吗?
),那么当把书本放到这个栈中超过盒子的顶部时就放不下了(叠上去的不算),这时就是"上溢","上溢"也就是栈顶指针指出栈的外面,显然是出错了。
反之,当栈中已没有书时,再去拿,看看没书,把盒子拎起来看看盒底,还是没有,这就是"下溢"。
"下溢"本身可以表示栈为空栈,因此可以用它来作为控制转移的条件。
顺序栈的类C语言定义:
typedefstruct{
SElemType*base;
SElemType*top;//设栈顶栈底两指针的目的是便于判断栈是否为空
intStackSize;//栈的当前可使用的最大容量.
}SqStack;
一般说来,在初始化设空栈时,不应限定栈的最大容量,而是:
先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用时,再逐段扩大。
顺序栈的的模块说明:
structSTACK{
SElemType*base;
SElemType*top;
intstacksize;
};
typedefstructSTACKSqstack;
StatusInitStack(SqStack&S);
StatusDestroyStack(SqStack&S);
StatusClearStack(SqStack&S);
StatusStackEmpty(SqStackS);
intStackLength(SqStackS);
StatusGetTop(SqStackS,SElemType&e);
StatusPush(SqStack&S,SElemTypee);
StatusPop(SqStack&S,SElemType&e);
StatusStackTraverse(SqStackS,Status(*visit)());
StatusInitStack(SqStack&S){
S.base=(SelemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INI_SIZE;
returnOK;
}//InitStack
StatusDestroyStack(SqStack&S){
}//DestroyStack
StatusClearStack(SqStack&S){
S.top=S.base;
}//ClearStack
StatusStackEmpty(SqStackS){
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
}//StackEmpty
intStackLength(SqStackS);{
inti;SElemType*p;
i=0;
p=S.top;
while(p!
=S.base){p++;i++;}
}//stackLength
StatusGetTop(SqStackS,SElemType&e);{
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returnOK;
}//GetTop
StatusPush(SqStack&S,SElemTypee);{
if(S.top-s.base>=S.stacksize){
S.base=(ElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
if(!
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}//Push
StatusPop(SqStack&S,SElemType&e);{
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}//Pop
StatusStackTraverse(SqStackS,Status(*visit)());{
}//StackTraverse
以上伪代码的C语言源码
#include
#include
#include
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineOK1
#defineEQUAL1
#defineOVERFLOW-1
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefintStatus;
structSTU{
charname[20];
charstuno[10];
intage;
intscore;
};
typedefstructSTUSElemType;
structSTACK{
SElemType*base;
SElemType*top;
intstacksize;
};
typedefstructSTACKSqStack;
typedefstructSTACK*pSqstack;
StatusInitStack(SqStack**S);
StatusDestroyStack(SqStack*S);
StatusClearStack(SqStack*S);
StatusStackEmpty(SqStackS);
intStackLength(SqStackS);
StatusGetTop(SqStackS,SElemType*e);
StatusPush(SqStack*S,SElemTypee);
StatusPop(SqStack*S,SElemType*e);
StatusStackTraverse(SqStackS,Status(*visit)());
StatusInitStack(SqStack**S){
(*S)=(SqStack*)malloc(sizeof(SqStack));
(*S)->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
(*S)->base)exit(OVERFLOW);
(*S)->top=(*S)->base;
(*S)->stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack*S){
free(S->base);
free(S);
}
StatusClearStack(SqStack*S){
S->top=S->base;
}
StatusStackEmpty(SqStackS){
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
}
intStackLength(SqStackS){
inti;
SElemType*p;
i=0;
p=S.top;
while(p!
=S.base){
p++;i++;
}
}
StatusGetTop(SqStackS,SElemType*e){
if(S.top==S.base)returnERROR;
*e=*(S.top-1);
returnOK;
}
StatusPush(SqStack*S,SElemTypee){
if(S->top-S->base>=S->stacksize){
S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S->base)exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*(S->top++)=e;
returnOK;
}
StatusPop(SqStack*S,SElemType*e){
if(S->top==
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言