数据结构顺序栈的基本运算.docx
《数据结构顺序栈的基本运算.docx》由会员分享,可在线阅读,更多相关《数据结构顺序栈的基本运算.docx(17页珍藏版)》请在冰豆网上搜索。
数据结构顺序栈的基本运算
《数据结构》上机报告
_______年____月____日
姓名__________学号___________同组成员___________
1.实验题目及要求
实验一:
顺序栈的各种基本运算
编写一个程序,实现顺序栈的各种基本运算,并在基础上完成以下功能:
1)初始化顺序栈;
2)判断顺序栈是否为空;
3)依次进栈元素a,b,c,d,e;
4)判断顺序栈是否为空;
5)输出栈长度;
6)输出从栈顶到栈底的元素;
7)读出栈顶元素;
8)删除栈顶元素;
9)输出从栈顶到栈底的元素;
10)判断顺序栈是否为空;
11)释放栈。
2.需求分析
首先初始化顺序栈
(1)判断顺序队列S是否为空
输入参数的格式和合法取值范围:
若顺序栈内无元素则输出顺序栈为空,反之
输出顺序栈为非空。
输出格式:
判断顺序栈是否为空:
测试数据:
初始化顺序表后,显示顺序栈为空。
(2)依次进栈元素a,b,c,d,e
输入参数的格式和合法取值范围:
依次进栈元素a,b,c,d,e并用逗号分隔。
输出格式:
依次进栈元素a,b,c,d,e。
测试数据:
依次进队列元素a,b,c,d,e后,顺序栈中包含a,b,c,d,e五个元素。
(3)输出栈的长度
输入参数的格式和合法取值范围:
此时顺序栈中包含a,b,c,d,e五个元素,故
长度为5。
输出格式:
输出栈长度:
5。
测试数据:
此时顺序栈中的元素为a,b,c,d,e。
所以屏幕显示输出栈长度:
5。
(4)输出从栈顶到栈底的元素
输入参数的格式和合法取值范围:
进栈顺序依次为a,b,c,d,e,故栈底为a,栈
顶为e,则栈顶到栈底元素依次为e,d,c,b,a。
输出格式:
输出从栈顶到栈底的元素:
edcba
测试数据:
进栈顺序依次为a,b,c,d,e,故栈底为a,栈顶为e,则栈顶到栈底
元素依次为e,d,c,b,a。
(5)读出栈顶元素
输入参数的格式和合法取值范围:
顺序栈中元素从栈顶到栈底依次为
e,d,c,b,a。
故栈顶为e。
输出格式:
读出栈顶元素:
e。
测试数据:
顺序栈中元素从栈顶到栈底依次为e,d,c,b,a。
故屏幕显示读出栈
顶元素为e。
(6)删除栈顶元素
输入参数的格式和合法取值范围:
顺序栈中元素从栈顶到栈底依次为
e,d,c,b,a。
故栈顶为e,删除e。
输出格式:
删除栈顶元素e。
测试数据:
顺序栈中元素从栈顶到栈底依次为e,d,c,b,a。
进行删除栈顶元素
操作,即删除元素e。
(7)输出从栈顶到栈底的元素
输入参数的格式和合法取值范围:
此时删除了栈顶元素e,栈顶元素变为d,故
顺序栈中元素从栈顶到栈底依次为d,c,b,a,
输出格式:
输出从栈顶到栈底的元素:
dcba
测试数据:
此时栈顶到栈底元素依次为d,c,b,a,故屏幕显示输出从栈顶到栈
底的元素:
dcba。
3.概要设计
(1)给出所用抽象数据类型的逻辑定义。
ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
结构关系:
R={|ai-1,ai∈D,i=2,…,n}
基本操作:
InitStack(&S)
操作前提:
S是一个未初始化的空栈。
操作结果:
构造一个空栈S。
DestroyStack(&S)
操作前提:
栈S已存在。
操作结果:
栈S清被摧毁。
StackEmpty(S)
操作前提:
栈S已存在。
操作结果:
若栈S为空栈,则返回TURE,否则返回FALSE。
StackJudgement
操作前提:
栈S已存在。
操作结果:
若栈S为空栈,则输出是,没否则输出否。
StackLength(S)
操作前提:
栈S已存在。
操作结果:
返回S的元素个数。
Push(&S,e)
操作前提:
栈S已存在。
操作结果:
插入元素e为新的栈顶元素。
GetTop(S,&e)
操作前提:
栈S已存在且非空。
操作结果:
用e返回S的栈顶元素。
Pop(&S,&e)
操作前提:
栈S已存在且非空。
操作结果:
删除S的栈顶元素,并用e返回其值。
StackTraverse(S,visit())
操作前提:
栈S已存在且非空。
操作前提:
从栈底到栈顶依次对S的每个数据元素调用函数visit()。
一
旦visit()失败,则操作失败。
(2)画出各模块之间的调用关系图。
mainDestroyStack
InitStack
StackEmpty
StackJudgement
StackLength
Push
GetTop
Pop
StackTraverse
(3)用伪码给出主程序的主要处理过程。
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineNULL0
#defineOVERFLOW-2
typedefintStatus;
typedefcharSElemType;
Statusvisit(SElemTypee);
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;}SqStack;
StatusInitStack(SqStack&S){
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);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusStackEmpty(SqStackS){
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
StatusStackJudgement(SqStackS)
{
if(S.top==S.base)
{
printf("是\n");
}
else
{
printf("否\n");
}
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;
}
intStackLength(SqStackS){
returnS.top-S.base;
}//StackLength
Statusvisit(SElemTypee){
printf("%c",e);
returnOK;
}
StatusGetTop(SqStackS,SElemType&e){
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returne;
}
StatusPop(SqStack&S,SElemType&e){
if(S.top==S.base)returnERROR;
e=*--S.top;
returne;
}
StatusStackTraverse(SqStackS,Status(*visit)(SElemType)){
while(S.top!
=S.base)
visit(*--S.top);
returnOK;
}
voidmain(){
SElemTypee;
SqStackS;
printf("
(1)初始化顺序栈。
\n");
InitStack(S);
printf("
(2)判断顺序栈是否为空:
\n");
StackJudgement(S);
StackEmpty(S);
printf("(3)依次进栈元素a,b,c,d,e:
\n");
Push(S,'a');
Push(S,'b');
Push(S,'c');
Push(S,'d');
Push(S,'e');
printf("(4)判断顺序栈是否为空:
\n");
StackJudgement(S);
StackEmpty(S);
printf("(5)输出栈长度:
%d\n",StackLength(S));
printf("(6)输出从栈顶到栈底的元素:
\n");
StackTraverse(S,visit);
printf("\n");
printf("(7)读出栈顶元素:
%c\n",GetTop(S,e));
printf("(8)删除栈顶元素:
%c\n",Pop(S,e));
printf("(9)输出从栈顶到栈底的元素:
\n");
StackTraverse(S,visit);
printf("\n");
printf("(10)判断顺序栈是否为空\n");
StackEmpty(S);
StackJudgement(S);
printf("(11)释放栈。
");
DestroyStack(S);
}
4.详细设计
(1)类型定义
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;}SqStack;
(2)给出所用抽象数据类型中每个操作的伪码算法
StatusInitStack(SqStack&S){
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);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusStackEmpty(SqStackS){
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
StatusStackJudgement(SqStackS)
{
if(S.top==S.base)
{
printf("是\n");
}
else
{
printf("否\n");
}
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;
}
intStackLength(SqStackS){
returnS.top-S.base;
}//StackLength
Statusvisit(SElemTypee){
printf("%c",e);
returnOK;
}
StatusGetTop(SqStackS,SElemType&e){
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returne;
}
StatusPop(SqStack&S,SElemType&e){
if(S.top==S.base)returnERROR;
e=*--S.top;
returne;
}
StatusStackTraverse(SqStackS,Status(*visit)(SElemType)){
while(S.top!
=S.base)
visit(*--S.top);
returnOK;
}
(3)给出其他模块的伪码算法
voidmain(){
SElemTypee;
SqStackS;
printf("
(1)初始化顺序栈。
\n");
InitStack(S);
printf("
(2)判断顺序栈是否为空:
\n");
StackJudgement(S);
StackEmpty(S);
printf("(3)依次进栈元素a,b,c,d,e:
\n");
Push(S,'a');
Push(S,'b');
Push(S,'c');
Push(S,'d');
Push(S,'e');
printf("(4)判断顺序栈是否为空:
\n");
StackJudgement(S);
StackEmpty(S);
printf("(5)输出栈长度:
%d\n",StackLength(S));
printf("(6)输出从栈顶到栈底的元素:
\n");
StackTraverse(S,visit);
printf("\n");
printf("(7)读出栈顶元素:
%c\n",GetTop(S,e));
printf("(8)删除栈顶元素:
%c\n",Pop(S,e));
printf("(9)输出从栈顶到栈底的元素:
\n");
StackTraverse(S,visit);
printf("\n");
printf("(10)判断顺序栈是否为空\n");
StackEmpty(S);
StackJudgement(S);
printf("(11)释放栈。
");
DestroyStack(S);
}
5.调试分析
(1)调试过程中主要遇到哪些问题?
是如何解决的?
在调试过程中,输出从栈顶到栈底的元素时出现了问题,使得输出不是字母而是数字,后发现原因在输出的数据类型错误,从而输出数字,将输出数据类型改为%c字符型后结果正确。
(2)经验和体会
通过这次试验,我深切的理解了顺序栈的知识要点和表示与实现。
并通过C语言实现了顺序队列的初始化,判空,删除,插入,等。
进一步熟练了C语言操作环境。
6.测试结果
7.附件
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineNULL0
#defineOVERFLOW-2
typedefintStatus;
typedefcharSElemType;
Statusvisit(SElemTypee);
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefstruct{
SElemType*base;
SElemType*top;
intstacksize;}SqStack;
StatusInitStack(SqStack&S){
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);
S.base=NULL;
S.top=NULL;
S.stacksize=0;
returnOK;
}
StatusStackEmpty(SqStackS){
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
StatusStackJudgement(SqStackS)
{
if(S.top==S.base)
{
printf("是\n");
}
else
{
printf("否\n");
}
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;
}
intStackLength(SqStackS){
returnS.top-S.base;
}//StackLength
Statusvisit(SElemTypee){
printf("%c",e);
returnOK;
}
StatusGetTop(SqStackS,SElemType&e){
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returne;
}
StatusPop(SqStack&S,SElemType&e){
if(S.top==S.base)returnERROR;
e=*--S.top;
returne;
}
StatusStackTraverse(SqStackS,Status(*visit)(SElemType)){
while(S.top!
=S.base)
visit(*--S.top);
returnOK;
}
voidmain(){
SElemTypee;
SqStackS;
printf("
(1)初始化顺序栈。
\n");
InitStack(S);
printf("
(2)判断顺序栈是否为空:
\n");
StackJudgement(S);
StackEmpty(S);
printf("(3)依次进栈元素a,b,c,d,e:
\n");
Push(S,'a');
Push(S,'b');
Push(S,'c');
Push(S,'d');
Push(S,'e');
printf("(4)判断顺序栈是否为空:
\n");
StackJudgement(S);
StackEmpty(S);
printf("(5)输出栈长度:
%d\n",StackLength(S));
printf("(6)输出从栈顶到栈底的元素:
\n");
StackTraverse(S,visit);
printf("\n");
printf("(7)读出栈顶元素:
%c\n",GetTop(S,e));
printf("(8)删除栈顶元素:
%c\n",Pop(S,e));
printf("(9)输出从栈顶到栈底的元素:
\n");
StackTraverse(S,visit);
printf("\n");
printf("(10)判断顺序栈是否为空\n");
StackEmpty(S);
StackJudgement(S);
printf("(11)释放栈。
");
DestroyStack(S);
}