数据结构C语言3Word文档格式.docx
- 文档编号:15719291
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:40
- 大小:273.06KB
数据结构C语言3Word文档格式.docx
《数据结构C语言3Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构C语言3Word文档格式.docx(40页珍藏版)》请在冰豆网上搜索。
因此,栈称为后进先出的线性表(LastInFirstOut,LIFO)。
栈的抽象数据类型定义:
ADTStack{
数据对象:
D={ai|ai(-ElemSet,i=1,2,...,n,n>
=0)
数据关:
R1={<
ai-1,ai>
|ai-1,ai(-D,i=2,...,n)
基本操作:
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{
intstacksize;
};
typedefstructSTACKSqstack;
StatusInitStack(SqStack&
S);
StatusDestroyStack(SqStack&
StatusClearStack(SqStack&
StatusStackEmpty(SqStackS);
intStackLength(SqStackS);
StatusGetTop(SqStackS,SElemType&
e);
StatusPush(SqStack&
S,SElemTypee);
StatusPop(SqStack&
S,SElemType&
StatusStackTraverse(SqStackS,Status(*visit)());
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
}//DestroyStack
S){
}//ClearStack
StatusStackEmpty(SqStackS){
if(S.top==S.base)returnTRUE;
elsereturnFALSE;
}//StackEmpty
{
inti;
SElemType*p;
i=0;
p=S.top;
while(p!
=S.base){p++;
i++;
}
}//stackLength
if(S.top==S.base)returnERROR;
e=*(S.top-1);
}//GetTop
{
if(S.top-s.base>
=S.stacksize){
S.base=(ElemType*)realloc(S.base,
(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
S.base)exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
}//Push
e=*--S.top;
}//Pop
}//StackTraverse
以上伪代码的C语言源码
#include<
stdio.h>
malloc.h>
conio.h>
#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);
StatusGetTop(SqStackS,SElemType*e);
StatusPush(SqStack*S,SElemTypee);
StatusPop(SqStack*S,SElemType*e);
StatusInitStack(SqStack**S){
(*S)=(SqStack*)malloc(sizeof(SqStack));
(*S)->
base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
(*S)->
base)exit(OVERFLOW);
top=(*S)->
base;
stacksize=STACK_INIT_SIZE;
returnOK;
}
StatusDestroyStack(SqStack*S){
free(S->
base);
free(S);
StatusClearStack(SqStack*S){
S->
top=S->
StatusStackEmpty(SqStackS){
elsereturnFALSE;
intStackLength(SqStackS){
SElemType*p;
=S.base){
p++;
StatusGetTop(SqStackS,SElemType*e){
*e=*(S.top-1);
StatusPush(SqStack*S,SElemTypee){
if(S->
top-S->
base>
=S->
stacksize){
S->
base=(SElemType*)realloc(S->
base,(S->
stacksize+STACKINCREMENT)*sizeof(SElemType));
base+S->
stacksize;
stacksize+=STACKINCREMENT;
*(S->
top++)=e;
StatusPop(SqStack*S,SElemType*e){
top==
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言