实验三顺序栈操作实现.docx
《实验三顺序栈操作实现.docx》由会员分享,可在线阅读,更多相关《实验三顺序栈操作实现.docx(7页珍藏版)》请在冰豆网上搜索。
实验三顺序栈操作实现
实验三顺序栈操作实现
实验日期:
2017年4月1日
实验目的及要求
1.熟练掌握栈的结构,以及这种数据结构的特点;
2.能够在两种存储结构上实现栈的基本运算,特别注意栈满和栈空的判断条件及描述方法。
实验内容
已知顺序栈的类型定义如下:
#defineMAX100
typedefchardatatype;
typedefstruct{
datatypedata[MAX];
inttop;
}SeqStack,*SeqStackptr;
任务
1.题目要求
任务一:
创建自定义头文件seqStack.h,包含顺序栈的数据类型定义及基本操作函数,需定义的基本操作如下:
(1)voidError(char*s);/*自定义错误处理函数*/
(2)voidInitStack(SeqStackptrsp);/*初始化栈——置空栈*/
(3)intEmptyStack(SeqStackptrsp);/*判栈空*/
(4)intFullStack(SeqStackptrsp);/*判栈满*/
(5)voidPush(SeqStackptrsp,datatypex);/*进栈(元素压入栈顶)*/
(6)datatypePop(SeqStackptrsp);/*出栈(元素从栈顶弹出)*/
(7)datatypeGetTop(SeqStackptrsp);/*读栈顶元素(不出栈)*/
(8)intCount(SeqStackptrsp);/*计算栈中元素个数*/
任务二:
创建一个新的程序文件sy13.cpp,请调用seqStack.h提供的顺序栈操作的函数完成把源文本文件中的所有十进制数转换成相应的指定进制的数值存于新的文本文件中,要求定义如下函数:
(1)voidTrans(intn,intr,charstr[])
功能:
把n整数转换为r进制的值并存于str数组中;
(2)voidTransFile(intr,charstrin[],charstrout[]);
功能:
把strin文件中十进制整数转换为r进制的值并存于文件strout中。
其中strin和strout字符数组中分别存放源文件名和目标文件名。
(思路:
1.以只读方式打开strin中的文件,以只写方式打开存于strout中的文件
2.循环读取strin文件
(1)读一个整数到变量num中
(2)调用Trans函数将num转换为r进制的字符串result
(3)将字符串result写入到文件strout中
3.关闭strin文件,strout文件。
)
(3)main函数中准备指定进制r的值,源文件名和目标文件名,调用TransFile函数完成相应要求。
2.请回答下列问题
(1)栈是限定在表的一端进行插入或删除操作的线性表,其操作原则是后进先出。
(2)一个不带表头结点链栈的栈顶指针是top,每个结点包含值域data和指针域next,判断栈空的条件为top==NULL,当p所指向的结点入栈,首先执行判断栈是否满,然后执行p->data[p->top++]=x操作。
(3)设数组S[100]存储一个顺序栈的元素,变量top指示下一个入栈元素在数组中的下标位置,栈为空的条件是top-1==NULL,栈为满的条件是top>=100。
3.seqStack.h及sy13.cpp源程序清单(含必要的注释)
SeqStack.h:
#include
#include
#defineMAX100
typedefchardatatype;
typedefstruct{
datatypedata[MAX];
inttop;
}SeqStack,*SeqStackptr;
SeqStacks;
SeqStackptrsp;
voidError(char*s);/*自定义错误处理函数*/
voidInitStack(SeqStackptrsp);/*初始化栈——置空栈*/
intEmptyStack(SeqStackptrsp);/*判栈空*/
intFullStack(SeqStackptrsp);/*判栈满*/
voidPush(SeqStackptrsp,datatypex);/*进栈(元素压入栈顶)*/
datatypePop(SeqStackptrsp);/*出栈(元素从栈顶弹出)*/
datatypeGetTop(SeqStackptrsp);/*读栈顶元素(不出栈)*/
intCount(SeqStackptrsp);/*计算栈中元素个数*/
voidError(char*s)/*自定义错误处理函数*/
{
printf("\n%s",s);
exit
(1);/*返回OS,该函数定义在stdlib.h中*/
}
voidInitStack(SeqStackptrsp)/*初始化栈——置空栈*/
{
sp->top=0;
}
intEmptyStack(SeqStackptrsp)/*判栈空*/
{
returnsp->top==0;/*返回值为1,栈空;返回值为0,栈不空*/
}
intFullStack(SeqStackptrsp)/*判栈满*/
{
returnsp->top>=MAX;/*返回值为1,栈满;返回值为0,栈不满*/
}
voidPush(SeqStackptrsp,datatypex)/*进栈(元素压入栈顶)*/
{
if(FullStack(sp)){/*若栈满*/
Error("StackFull");
}
sp->data[sp->top]=x;
sp->top++;
}
datatypePop(SeqStackptrsp)/*出栈(元素从栈顶弹出)*/
{
if(EmptyStack(sp)){/*若栈空*/
Error("StackEmpty");
}
sp->top--;
returnsp->data[sp->top];
}
datatypeGetTop(SeqStackptrsp)/*读栈顶元素(不出栈)*/
{
if(EmptyStack(sp)){/*若栈空*/
Error("StackEmpty");
}
returnsp->data[sp->top-1];
}
intCount(SeqStackptrsp)/*计算栈中元素个数*/
{
returnsp->top;
}
sy13.cpp:
#include"seqStack.h"
voidTrans(intn,intr,charstr[]);/*把n整数转换为r进制的值并存于str数组中*/
voidTransFile(intr,charstrin[],charstrout[]);/*把strin文件中十进制整数转换为r进制的值并存于文件strout中。
其中strin和strout字符数组中分别存放源文件名和目标文件名*/
voidmain(){
intr;
chars[MAX],t[MAX];
printf("请输入进制r的值:
");
scanf("%d",&r);
TransFile(r,s,t);
}
voidTrans(intn,intr,charstr[]){/*把n整数转换为r进制的值并存于str数组中*/
inti,c;
SeqStacks;
InitStack(&s);
do{
c=n%r;
if(c<10){
c=c+'0';
}
else{
c=c-10+'a';
}
Push(&s,c);
}while(n/=r);
i=0;
while(!
EmptyStack(&s)){
str[i++]=Pop(&s);
}
str[i]='\0';
}
voidTransFile(intr,charstrin[],charstrout[]){/*把strin文件中十进制整数转换为r进制的值并存于文件strout中。
其中strin和strout字符数组中分别存放源文件名和目标文件名*/
intnum,i,n;
charresult[MAX];
FILE*fin;
FILE*fout;
if((fin=fopen("D:
/strin.txt","r"))==NULL){
Error("Cannotopenfile!
");
}
if((fout=fopen("D:
/strout.txt","w"))==NULL){
Error("Cannotopenfile!
");
}
fprintf(fout,"源数据转化为%d进制后为:
\n",r);
while(!
feof(fin)){
fscanf(fin,"%d",&num);
Trans(num,r,result);
fprintf(fout,"%s",result);
}
fclose(fin);
fclose(fout);
}
4.源文本文件的内容,程序执行后目标数据文件的内容
实验总结分析(本程序的重点与难点,调试中出现的问题及解决方法等)
WelcomeTo
Download!
!
!
欢迎您的下载,资料仅供参考!