堆栈应用题.docx
- 文档编号:10361681
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:27
- 大小:1.97MB
堆栈应用题.docx
《堆栈应用题.docx》由会员分享,可在线阅读,更多相关《堆栈应用题.docx(27页珍藏版)》请在冰豆网上搜索。
堆栈应用题
程序与算法综合设计
课程设计报告
设计题目:
堆栈应用题
学生姓名:
专业:
班级:
指导老师:
完成日期:
2013.7.6
合肥工业大学
(一)需求和规格说明
堆栈应用题
要求:
一、设计一个堆栈类,实现对于软件操作中常用的撤销/重做
(Undo/Redo)的支持。
二、使用控制台或者图形界面,测试这个堆栈类的使用。
三、创建一个文件并进行编辑
注:
一、二为题目要求,三是自己附加的功能
(二)设计
系统类图
f_stack
intcount;//统计数目
node*top;//头指针
filestack();
~filestack();
boolempty()const;
error_codeget_top(charfileroad[],charfilename[])const;//取出栈顶元素
error_codepush(charfileroad[],charfilename[]);//压栈
error_codepop();//弹栈
error_codepop(charfileroad[],charfilename[]);//将指定元素出栈
boolsearch(charfileroad[],charfilename[]);//寻找指定元素
类外的函数
函数名称
返回类型
所含参数
实现功能
in_word()
int
charfileroad[]
charfilename[]
对文件进行输入编辑
copy_word()
int
charfileorignl[]
charfilename[]
charfileroad[]
对文件中的内容进行拷贝
creatfile()
void
charfileroad[]
charfilename[]
filestack&
fstack1
filestack&
fstack3
filestack&
fstack4
创建新文件并备份
deletefile()
void
filestack&fstack
charfileroad[]
charfilename[]
删除文件操作
recoverfile()
void
filestack&fstack,
charfileroad[]
charfilename[]
恢复删除的文件
recoverfileroad()
void
filestack&fstack
charofileroad[]
charfileroad[]
charfilename[]
复制文件路径
undo_moreoperate()
void
filestack&fstack1
filestack&fstack2
filestack&fstack3
filestack&fstack4
char&op
charfroado[]
撤销之前的某步操作
undo_operate()
void
filestack&fstack1
filestack&fstack2
filestack&fstack3
filestack&fstack4
char&op
charfroado[]
撤消操作
searchroad()
void
filestack&fstack4
charofileroad[]
charfilename[]
寻找文件路径
redo_file()
void
filestack&fstack1
filestack&fstack3
filestack&fstack4
重做操作
delete_copyoperate()
void
filestack&fstack
删除副本(及删除“copy”文件夹里的文件)
save()
void
filestack&fstack
对所有操作进行保存,不可恢复
f_operate()
void
无
对文件进行操作
(三)用户手册
程序运行时,首先提示选择要进行的操作。
对于创建文件时,提示输入文件路径以及文件名
对于撤消操作时,提示进行撤销上一步还是撤销之前的操作;
对于重做操作,提示进行恢复的路径;
对于结束所有操作,提示是否保存所有操作。
(四)调试及测试
运行实例:
(1)创建文件的操作
(2)撤销操作
(3)重做操作
(4)保存所有操作
进一步改进
(1)目前程序中,主要以建立文件,删除文件以及恢复文件为主要功能,辅以对文件进行编辑。
以后可以加入打开文件等其他功能。
(2)目前是通过控制台进行操作,并不是很直观,在以后可以借助图形界面(MFC)来实现对文件的操作。
附录源程序
(1)f_stack.h
#include
#include
#include
usingnamespacestd;
enumerror_code{success,underflow};
structnode{
charfroad[50];//存储文件路径
charfname[30];//存储文件名
node*next;
};
classfilestack{
public:
filestack();
~filestack();
boolempty()const;
error_codeget_top(charfileroad[],charfilename[])const;//取出栈顶元素
error_codepush(charfileroad[],charfilename[]);//压栈
error_codepop();//弹栈
error_codepop(charfileroad[],charfilename[]);//将指定元素出栈
boolsearch(charfileroad[],charfilename[]);//寻找指定元素
private:
intcount;
node*top;
};
filestack:
:
filestack(){
count=0;
top=NULL;
}
boolfilestack:
:
empty()const{
returncount==0;
}
error_codefilestack:
:
get_top(charfileroad[],charfilename[])const{
if(empty()){
returnunderflow;
}
else{
strcpy(fileroad,top->froad);
strcpy(filename,top->fname);
returnsuccess;
}
}
error_codefilestack:
:
push(charfileroad[],charfilename[]){
node*s=newnode;
strcpy(s->froad,fileroad);
strcpy(s->fname,filename);
s->next=NULL;
s->next=top;
top=s;
count++;
returnsuccess;
}
error_codefilestack:
:
pop(){
if(empty()){
returnunderflow;
}
else{
node*u=top;
top=top->next;
deleteu;
count--;
returnsuccess;
}
}
error_codefilestack:
:
pop(charfileroad[],charfilename[])
{
charcroad[80];
strcpy(croad,fileroad);
strcat(croad,filename);
filestackf1;
if(empty()){
returnunderflow;
}
else{
charfr[50],frc[50],fn[30];
get_top(fr,fn);
strcpy(frc,fr);
if(strcmp(strcat(frc,fn),croad)==0){
pop();
}
else{
while(strcmp(strcat(frc,fn),croad)!
=0){
f1.push(fr,fn);
pop();
get_top(fr,fn);
strcpy(frc,fr);
}
pop();
while(!
f1.empty()){
f1.get_top(fr,fn);
push(fr,fn);
f1.pop();
}
}
}
returnsuccess;
}
//寻找指定文件
boolfilestack:
:
search(charfileroad[],charfilename[])
{
charcroad[80];
strcpy(croad,fileroad);
strcat(croad,filename);
filestackf1;
if(empty()){
returnfalse;
}
else{
charfr[50],frc[50],fn[30];
get_top(fr,fn);
strcpy(frc,fr);
if(strcmp(strcat(frc,fn),croad)==0){
returntrue;
}
else{
while(strcmp(strcat(frc,fn),croad)!
=0){
f1.push(fr,fn);
pop();
get_top(fr,fn);
strcpy(frc,fr);
}
while(!
f1.empty()){
f1.get_top(fr,fn);
push(fr,fn);
f1.pop();
}
returntrue;
}
}
returnfalse;
}
//析构函数
//对文件进行文字编辑
intin_word(charfileroad[],charfilename[])
{
charc='A';
charfrc[50];
strcpy(frc,fileroad);//拷贝文件路径
charfname[80];
strcpy(fname,strcat(frc,filename));
ofstreamoutfile(fname,ios:
:
out|ios:
:
trunc);//打开相应文件
if(!
outfile){
cerr<<"openerror!
"< exit (1); } cout<<"enterthewords: "< //进行文字的录入 while(c! ='\\'){ cin>>c; outfile< } outfile.close(); return0; } //对文件中的内容进行拷贝 intcopy_word(charfileorignl[],charfilename[],charfileroad[]) { } //创建新文件并备份 voidcreatfile(charfileroad[],charfilename[],filestack&fstack1,filestack&fstack3,filestack&fstack4){ //指定备份路径 charfr[80]="copy/"; charfrc[80]="copy/"; charcroad[80]; charfrs[80]="redosave/"; charfrsc1[80]="redosave/"; charfrsc2[80]="redosave/"; charfrsr[80]="redosaveroad/"; charfrscr1[80]="redosaveroad/"; charfrscr2[80]="redosaveroad/"; strcpy(croad,fileroad); //创建文件 ofstreamoutfile1(strcat(croad,filename),ios: : out|ios: : trunc); if(! outfile1){ cerr<<"openerror! "< exit (1); } outfile1.close(); //备份到指定路径 ofstreamoutfile2(strcat(fr,filename),ios: : out|ios: : trunc); if(! outfile2){ cerr<<"copyerror! "< exit (1); } outfile2.close(); //对所有创建操作建立映像 ofstreamoutfile3(strcat(frs,filename),ios: : out|ios: : trunc); if(! outfile3){ cerr<<"savecopyerror! "< exit (1); } outfile3.close(); //对创建文件的路径进行保存 ofstreamoutfile4(strcat(frsr,filename),ios: : out|ios: : trunc); if(! outfile4){ cerr<<"savecopyerror! "< exit (1); } charc[50]; inti=0; while(fileroad[i]! ='\0'){ c[i]=fileroad[i]; i++; } c[i]='\0'; i=0; while(c[i]! ='\0'){ outfile4< i++; } outfile4.close(); cout< cout<<"————成功建立(更新)"< cout< //对已创建的文件进行编辑 charchoice; fstack1.push(fileroad,filename); fstack3.push(frsc2,filename); fstack4.push(frscr2,filename); cout<<"是否需要对新创建的文件进行编辑? \n需要,键入Y;不需要,键入N。 \n"; cout<<"请确认是否需要进行编辑: "; do{ cin>>choice; switch(choice){ case'N': cout<<"请选择下一步操作。 "< break; case'Y': in_word(fileroad,filename); copy_word(croad,filename,frc); copy_word(croad,filename,frsc1); cout<<"结束编辑,请选择下一步操作。 "< break; default: cout<<"输入错误! 请确认! "< break; }}while(choice! ='Y'&&choice! ='N'); } //删除文件操作 //恢复删除的文件 voidrecoverfile(filestack&fstack,charfileroad[],charfilename[]) { fstack.push(fileroad,filename); charor[80]="copy/"; strcat(or,filename); charcroad[80]; strcpy(croad,fileroad); ofstreamoutfile1(strcat(croad,filename),ios: : out|ios: : trunc); if(! outfile1){ cerr<<"redoerror! "< exit (1); }copy_word(or,filename,fileroad); outfile1.close(); } //复制文件路径 voidrecoverfileroad(filestack&fstack,charofileroad[],charfileroad[],charfilename[]) { fstack.push(fileroad,filename); charfrsr[80]; strcpy(frsr,fileroad); ofstreamoutfile(strcat(frsr,filename),ios: : out|ios: : trunc); if(! outfile){ cerr<<"savecopyerror! "< exit (1); } charc[50]; inti=0; while(ofileroad[i]! ='\0'){ c[i]=ofileroad[i]; i++; } c[i]='\0'; i=0; while(c[i]! ='\0'){ outfile< i++; } outfile.close(); } //撤销之前的某步操作 voidundo_moreoperate(filestack&fstack1,filestack&fstack2,filestack&fstack3,filestack&fstack4,char&op,charfroado[]) { charchoice='C'; charfileroad[50]; charfilename[30]; charofile[50]="copy/"; charsfile[50]="redosave/"; charsrfile[50]="redosaveroad/"; cout<<"请确认是恢复之前的删除(C),还是撤销之前的创建(U),请键入: "; do{ cin>>choice; switch(choice){ case'U': cout<<"请输入要撤销之前创建的文件路径: "; cin>>fileroad; strcpy(froado,fileroad); cout<<"请输入要撤销之前创建的文件名: "; cin>>filename; deletefile(fstack1,fileroad,filename); deletefile(fstack3,sfile,filename); deletefile(fstack4,srfile,filename); fstack2.push(ofile,filename); op='U'; break; case'C': cout<<"请输入要恢复之前删除的文件路径: "; cin>>fileroad; strcpy(froado,fileroad); cout<<"请输入要恢复之前删除的文件名: "; cin>>filename; recoverfile(fstack1,fileroad,filename); cout<<"已成功恢复文件"< recoverfile(fstack3,sfile,filename); recoverfileroad(fstack4,fileroad,srfile,filename); fstack2.pop(ofile,filename); op='C'; break; default: cout<<"请确认输入编号是否正确"; break; } }while(choice! ='C'&&choice! ='U'); } //撤消操作 voidundo_operate(filestack&fstack1,filestack&fstack2,filestack&fstack3,filestack&fstack4,char&op,charfroado[]) { charfileroad[50]; charfilename[30]; charchoice='O'; charofile[50]="copy/"; charsfile[50]="redosave/"; charsrfile[50]="redosaveroad/"; cout<<"请确认撤消操作! 撤销上一步键入O,其它请键入M\n"; cout<<"请输入: "; do{ cin>>choice; switch(choice){ case'O': if(op=='C'){ fstack1.get_top(fileroad,filename); strcpy(froado,fileroad); deletefile(fstack1,fileroad,filename); deletefile(fstack3,sfile,filename); deletefile(fstack4,srfile,filename); fstack2.push(ofile,filename); cout<<"成功删除文件"< \n"; op='U'; } else{ fstack2.get_top(fileroad,filename); recoverfile(fstack1,froado,filename); recoverfile(fstack3,sfile,filename); recoverfileroad(fstack4,froado,srfile,filename); fstack2.pop();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 堆栈 应用题