用顺序栈进行栈的基本操作数据结构课程设计报告Word文档下载推荐.docx
《用顺序栈进行栈的基本操作数据结构课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《用顺序栈进行栈的基本操作数据结构课程设计报告Word文档下载推荐.docx(9页珍藏版)》请在冰豆网上搜索。
二.关键字
TopStacksizeBase
三.内容要求
先为栈分配一个基本容量,并给存储空间分配增量当栈的空间不够使用时再逐段扩大。
其中stacksize指示的是栈的当前可使用的最大容量。
而false和true分别指的是栈是否为空,false为1反之亦然;
error和ok则是指栈中元素是否可以返回即栈底元素是否为零,error为1反之亦然。
分别对从一到十二等十二个元素进行压栈然后弹栈,每当插入新的栈顶元素时,指针top增1;
删除栈顶元素时即弹栈时指针top减1,因此非空栈中的栈顶指针始终在栈顶元素的下一个位置上。
最后进行销毁栈的操作,并得到top=0,stacksize=0,base=0的运行结果。
四.流程图
五.程序源代码
//main3-1.cpp检验bo3-1.cpp的主程序
//#include"
c1.h"
#include<
iostream.h>
#include<
string.h>
ctype.h>
malloc.h>
limits.h>
//#include<
stdio.h>
stdlib.h>
io.h>
math.h>
sys/timeb.h>
stdarg.h>
//提供宏va_start,va_arg和va_end,用于存取变长参数表
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
//#defineINFEASIBLE-1没使用
//#defineOVERFLOW-2因为在math.h中已定义OVERFLOW的值为3,故去掉此行
typedefintStatus;
//Status是函数的类型,其值是函数结果状态代码,如OK等
typedefintBoolean;
//Boolean是布尔类型,其值是TRUE或FALSE
typedefintSElemType;
//定义栈元素类型,此句要在c3-1.h的前面
//#include"
c3-1.h"
#defineSTACK_INIT_SIZE10//存储空间初始分配量
#defineSTACK_INCREMENT2//存储空间分配增量
structSqStack//顺序栈
{
SElemType*base;
//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
};
voidInitStack(SqStack&
S)//构造一个空栈S。
{
if(!
(S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
exit(OVERFLOW);
//动态分配存储空间失败,则退出
S.top=S.base;
//栈顶指向栈底(空栈)
S.stacksize=STACK_INIT_SIZE;
//存储空间为初始分配量
}
voidDestroyStack(SqStack&
S)//销毁栈S,S不再存在
free(S.base);
//释放栈空间
S.top=S.base=NULL;
//栈顶、栈底指针均为空
S.stacksize=0;
//当前已分配的存储空间为0
voidClearStack(SqStack&
S)//把栈S置为空栈
//栈顶指针指向栈底
StatusStackEmpty(SqStackS)//若栈S为空栈,则返回TRUE;
否则返回FALSE
{
if(S.top==S.base)//空栈条件
returnTRUE;
else
returnFALSE;
intStackLength(SqStackS)//返回栈S的元素个数,即栈的长度
returnS.top-S.base;
StatusGetTop(SqStackS,SElemType&
e)//若栈S不空,则用e返回S的栈顶元素,并返回OK;
否则返回ERROR
if(S.top>
S.base)//栈不空
e=*(S.top-1);
//将栈顶元素赋给e
returnOK;
returnERROR;
voidPush(SqStack&
S,SElemTypee)//插入元素e为栈S新的栈顶元素
{。
if(S.top-S.base==S.stacksize)//栈满
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACK_INCREMENT)*
sizeof(SElemType));
//追加存储空间
S.base)//追加存储空间失败,则退出
S.top=S.base+S.stacksize;
//修改栈顶指针,指向新的栈顶
S.stacksize+=STACK_INCREMENT;
//更新当前已分配的存储空间
*(S.top)++=e;
//将e入栈,成为新的栈顶元素,栈顶指针上移1个存储单元
StatusPop(SqStack&
S,SElemType&
e)
if(S.top==S.base)//栈空
e=*--S.top;
//将栈顶元素赋给e,栈顶指针下移1个存储单元
voidStackTraverse(SqStackS,void(*visit)(SElemType))//从栈底到栈顶依次对栈S中每个元素调用函数visit()
while(S.top>
S.base)//S.base指向栈元素
visit(*S.base++);
//对该栈元素调用visit(),
cout<
<
"
\n"
;
//栈底指针上移1个存储单元
#defineElemTypeSElemType
Statusequal(ElemTypec1,ElemTypec2)//判断是否相等的函数
{
if(c1==c2)
intcomp(ElemTypea,ElemTypeb)//根据a<
、=或>
b,分别返回-1、0或1
if(a==b)
return0;
return(a-b)/abs(a-b);
voidprint(ElemTypec)//以十进制整型的格式输出元素的值
c;
\t"
voidprint1(ElemType&
c)//以十进制整型的格式输出元素的值(设c为引用类型)
voidprint2(ElemTypec)//以字符型的格式输出元素的值
voidmain()
intj;
SqStacks;
SElemTypee;
InitStack(s);
//初始化栈s
for(j=1;
j<
=12;
j++)
Push(s,j);
//将值为j的栈元素入栈s中
栈中元素依次为\n"
StackTraverse(s,print);
//从栈底到栈顶依次对栈s中每个元素调用print()函数
Pop(s,e);
//弹出栈顶元素,其值赋给e
弹出的栈顶元素e="
e;
endl;
栈空否?
StackEmpty(s);
\t(1:
空0:
否)"
GetTop(s,e);
//将新的栈顶元素赋给e
\n栈顶元素e="
栈的长度为"
StackLength(s);
ClearStack(s);
//清空栈s
清空栈后,栈空否?
否)\n"
DestroyStack(s);
//销毁栈s
销毁栈后:
\ns.top="
ElemType(s.top);
s.stacksize="
ElemType(s.stacksize);
s.base="
ElemType(s.base);
四.编译及调试
五.参考文献
1.李春葆等编著.C语言程序设计题典.北京:
清华大学出版社,2002
2.钱能编著.C++程序设计教程.北京:
清华大学出版社,1999
3.程耀等编著.VisualC++6.0程序设计教程.北京:
电子工业出版社,1998
评语
评阅人:
日期: