长沙理工大学数据结构栈的实现及应用算术表达式求值实验报告Word文档下载推荐.docx
- 文档编号:18722686
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:10
- 大小:35.34KB
长沙理工大学数据结构栈的实现及应用算术表达式求值实验报告Word文档下载推荐.docx
《长沙理工大学数据结构栈的实现及应用算术表达式求值实验报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《长沙理工大学数据结构栈的实现及应用算术表达式求值实验报告Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
If(当前操作符优先级大于操作符栈栈顶的优先级)
If(非”)”操作符)
将当前操作符进操作符栈;
Else
While(操作符栈栈顶不等于”(“)
取操作符栈栈顶及数字栈的两个数进行运算,并将结果压入数字栈;
If(非(“操作符)
取操作符栈栈顶及数字栈的两个数进行运算,并将结果压入数字栈;
Continue;
(直到当前操作符比栈顶操作符优先级大)
Else
将当前操作符进操作符栈;
3、While(操作符栈非空)
操作符栈栈顶及数字栈的两个数进行运算,并将结果压入数字栈;
4、在数字栈取最后结果并输出。
//10*8^2+16.3+5*(5.2*5+3.01)/4-(-10)+0.1000060+4.00416-40=666.666666
//100+(-100)-(-10^2)=100
//(((2016-2017+(((2015-2014))))))=0
//-1+(((((((((1^0))))))))+100%10^2=0
#include<
iostream>
stdio.h>
math.h>
string.h>
iomanip>
map>
usingnamespacestd;
constintMAX=105;
typedefdoubleType;
typedefstruct
{
TypeTypeStack[MAX];
charcharStack[MAX];
intTypeTop,charTop;
}Stack;
//初始化栈
voidInitStack(Stack*S)
S->
charTop=S->
TypeTop=0;
}
//判断charStack是否为空
boolIsEmpty_Char(StackS)
returnS.charTop==0;
//判断TypeStack是否为空
boolIsEmpty_Type(StackS)
returnS.TypeTop==0;
//判断charStack是否为满
boolIsFull_Char(StackS)
returnS.charTop==MAX;
//判断TypeStack是否为满
boolIsFull_Type(StackS)
returnS.TypeTop==MAX;
voidPush_Char(Stack*S,charch)
//charStack不为满则入栈,否则输出提示
if(!
IsFull_Char(*S))
S->
charStack[S->
charTop++]=ch;
else
cout<
<
"
TheCharStackIsFull!
<
endl;
voidPush_Type(Stack*S,Typea)
//TypeStack不为满则入栈,否则输出提示
IsFull_Type(*S))
TypeStack[S->
TypeTop++]=a;
TheTypeStackIsFull!
charPop_Char(Stack*S)
IsEmpty_Char(*S))
{
charTop--;
returnS->
charTop];
}
TheCharStackIsEmpty!
return-1;
TypePop_Type(Stack*S)
IsEmpty_Type(*S))
TypeTop--;
TypeTop];
TheTypeStackIsEmpty!
charTop_Char(StackS)
IsEmpty_Char(S))
returnS.charStack[--S.charTop];
TypeTop_Type(StackS)
IsEmpty_Type(S))
returnS.TypeStack[--S.TypeTop];
TypeCalculate(Typeleft,Typeright,charop)
Typevalue=0;
switch(op)
case'
+'
:
value=left+right;
break;
-'
value=left-right;
*'
value=left*right;
/'
if(right!
=0)
value=left/right;
else
cout<
被除数不能为零!
"
break;
%'
value=(int)left%(int)right;
被余数不能为零!
^'
value=pow(left,right);
/*value=1;
if(right>
while(right--)
value*=left;
{
right=-right;
value/=left;
}*/
returnvalue;
voidComputer(char*mid_equotion,Typelen)
Typeright,left,result;
char*p_mid_equotion=mid_equotion;
charafter_equotion='
'
;
map<
char,Type>
Oper;
Oper['
#'
]=1;
('
]=2;
]=3;
]=4;
]=5;
)'
]=6;
StackMyStack;
InitStack(&
MyStack);
Push_Char(&
MyStack,'
);
chartop_oper,current_oper;
for(;
*p_mid_equotion!
='
\0'
)
top_oper=Top_Char(MyStack);
current_oper=*p_mid_equotion;
if(!
Oper[current_oper])
{
Push_Type(&
MyStack,strtod(p_mid_equotion,&
p_mid_equotion));
continue;
}//endif
else//为操作符
if(Oper[current_oper]>
Oper[top_oper])
{
if(current_oper!
Push_Char(&
MyStack,current_oper);
while(top_oper!
{
right=Pop_Type(&
if(!
IsEmpty_Type(MyStack))
left=Pop_Type(&
else
left=0;
Push_Type(&
MyStack,Calculate(left,right,Top_Char(MyStack)));
Pop_Char(&
top_oper=Top_Char(MyStack);
}
Pop_Char(&
}//endelse
}//endif
else
if(current_oper=='
if(*(p_mid_equotion+1)=='
MyStack,0);
}
right=Pop_Type(&
if(!
left=Pop_Type(&
else
left=0;
Push_Type(&
MyStack,Calculate(left,right,top_oper));
continue;
}//endelse
}//endelse
p_mid_equotion++;
}//endfor
top_oper=Pop_Char(&
while(top_oper!
right=Pop_Type(&
left=Pop_Type(&
else
left=0;
Push_Type(&
top_oper=Pop_Char(&
//cout<
setprecision(6)<
\nTheResult="
(result=Pop_Type(&
MyStack))<
printf("
TheResult=%lf\n\n"
(result=Pop_Type(&
MyStack)));
intmain()
chars[MAX]="
Typei=0;
cout<
请输入你要求值的表达式!
(以-1结束)\n"
while(cin>
>
s&
&
strcmp(s,"
-1"
)!
Computer(s,strlen(s));
return0;
对“+”,“-”,“*”,“/”,“%”,“^”运算的实现
可运算多位数和小数,求余,求平方,括号里包含负数如(-1),及首个数字为负数如-1+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 长沙 理工大学 数据结构 实现 应用 算术 表达式 求值 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)