堆栈应用题.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();