数据结构课程设计表达式求值Word格式.docx
《数据结构课程设计表达式求值Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计表达式求值Word格式.docx(17页珍藏版)》请在冰豆网上搜索。
voidPop(StackS);
typedefstructNode{
charElement;
PtrToNodeNext;
};
/*float类型链表式堆栈,用来存放操作数*/
typedefstructFNode*Ptr_Fn;
typedefPtr_FnFStack;
intFisEmpty(FStackS);
voidFPush(floatX,FStackS);
floatFTop(FStackS);
voidFPop(FStackS);
typedefstructFNode{
floatElement;
Ptr_FnNext;
voidConvertToPost(FILE*In,StackWhereat,FILE*Temp);
voidReverse(StackRev);
voidCalculate(FILE*Change,StackWhereat,FILE*Temp);
/******主函数******/
intmain()
{
FILE*InputFile,*OutputFile,*Temp;
/*初始化变量*/
StackWhereat;
charsample;
InputFile=fopen("
Input.txt"
"
r"
);
/*打开文件*/
OutputFile=fopen("
Output.txt"
w"
Whereat=malloc(sizeof(structNode));
/*给Whereat分配空间*/
Whereat->
Next=NULL;
if(!
InputFile||!
OutputFile){/*错误处理*/
printf("
intputoroutputfile(s)donotexist.\n"
return
(1);
}
sample=getc(InputFile);
while(sample!
=EOF){
Temp=fopen("
Temp.txt"
w+"
/*生成Temp文件*/
ungetc(sample,InputFile);
/*putbacksample字符*/
ConvertToPost(InputFile,Whereat,Temp);
/*中缀变后缀*/
if(PrintError){/*错误处理*/
fprintf(OutputFile,"
Errorininfixnotation."
fscanf(InputFile,"
\n"
&
sample);
PrintError=0;
}
elseif(IsEmpty(Whereat)==1){/*跳过在input文件中的空格*/
elseif(IsEmpty(Whereat)!
=1){
Reverse(Whereat);
if(Top(Whereat)=='
B'
){/*错误处理,*/
/*A表示操作数B表示运算符*/
PrintError=1;
/*后缀表达式第一个元素应是操作数而不是运算符号*/
}
fclose(Temp);
r+"
Calculate(OutputFile,Whereat,Temp);
/*计算结果*/
MakeEmpty(Whereat);
/*清空Whereat用来处理下一行*/
putc('
\n'
OutputFile);
/*在输出文件中换行*/
sample=getc(InputFile);
}/*While循环结束*/
free(Whereat);
fclose(InputFile);
fclose(OutputFile);
remove("
/*删除Temp.txt*/
return1;
}
/******检查堆栈是否为空******/
intIsEmpty(StackS)
{
return(S->
Next==NULL);
/******检查float堆栈是否为空******/
intFIsEmpty(FStackS)
/******弹出栈顶元素******/
voidPop(StackS)
{
PtrToNodeFirstCell;
if(IsEmpty(S))
perror("
EmptyStack"
else{
FirstCell=S->
Next;
S->
Next=S->
Next->
free(FirstCell);
/******弹出float栈顶元素******/
voidFPop(FStackS)
{
Ptr_FnFirstCell;
if(FIsEmpty(S))
/******将堆栈置空******/
voidMakeEmpty(StackS)
if(S==NULL)
MustuseCreatestackfirst"
else
while(!
IsEmpty(S))
Pop(S);
/******将float堆栈置空******/
voidFMakeEmpty(FStackS)
/******元素进栈******/
voidPush(charX,StackS)
{
PtrToNodeTmpCell;
TmpCell=(PtrToNode)malloc(sizeof(structNode));
if(TmpCell==NULL)
perror("
OutofSpace!
"
TmpCell->
Element=X;
Next=TmpCell;
/******float元素进栈******/
voidFPush(floatX,FStackS)
Ptr_FnTmpCell;
TmpCell=(Ptr_Fn)malloc(sizeof(structFNode));
/******返回栈顶元素******/
charTop(StackS)
returnS->
Element;
perror("
exit
(1);
return0;
/******返回float栈顶元素******/
floatFTop(FStackS)
FIsEmpty(S))
/******将堆栈元素倒置******/
voidReverse(StackRev)
StackTempstack;
Tempstack=malloc(sizeof(structNode));
Tempstack->
IsEmpty(Rev)){
Push(Top(Rev),Tempstack);
/*将元素压栈到一个临时堆栈*/
Pop(Rev);
Rev->
Next=Tempstack->
/*指向新的堆栈*/
/*******
Whereat说明:
Whereat记录了操作数和运算符号的位置,用A和B区分。
A=operand,B=operator.
(例如1+2转换成12+,在whereat中的形式应该是AAB)
OpHolder说明:
Char类型的堆栈Opholder用来保存运算符号。
******/
/******将中缀表带式转换为后缀表达式******/
voidConvertToPost(FILE*In,StackWhereat,FILE*Temp)
StackOpHolder;
charholder;
charlastseen;
intdigitcounter=0;
/*操作数的计数器*/
OpHolder=malloc(sizeof(structNode));
/*初始化*/
OpHolder->
holder=getc(In);
lastseen='
@'
;
/*用来防止输入格式错误,例如两个小数点*/
putc('
'
Temp);
while((holder!
='
)&
&
(holder!
=EOF)){
if(holder=='
){
digitcounter=0;
elseif(IsOperator(holder)==-1){/*如果holder不是操作数或运算符号*/
PrintError=1;