C++计算数学计算式内附完整源码及附件Word下载.docx
- 文档编号:8365018
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:12
- 大小:364.90KB
C++计算数学计算式内附完整源码及附件Word下载.docx
《C++计算数学计算式内附完整源码及附件Word下载.docx》由会员分享,可在线阅读,更多相关《C++计算数学计算式内附完整源码及附件Word下载.docx(12页珍藏版)》请在冰点文库上搜索。
第二,检索str里的字符,如果遇到+-*/,就将strNumber数字进队,strSymbol运算符进队
循环进行,直到到达str的末尾。
其次,将中缀表达式转换成后缀表达式,将其添加到字符串队列stringQueueBack
第一,遇到数字就直接将数字字符串添加到队列
第二,如果stringStack栈为空,则将运算符字符进栈
第三,如果stringStack栈不为空,若第一个运算符的优先级小于等于栈顶的运算符的优先级,则先把栈的所有高于等于第一个运算符添加到队列(然后出栈),再把低或等的运算符压入栈
第四,如果遇到左括号,则直接压栈
第五,遇到右括号,则直接把左括号右边的所有运算符出栈,添加到队列
表2中缀表达式转后缀表达式例子
例如1/20-5+((2-10*5)+5-10*2)
stringQueueMiddle(中缀表达式队列)
stringStack(栈)
stringQueueBack
(后缀表达式队列)
1/20-5+((2-10*5)+5-10*2)
/20-5+((2-10*5)+5-10*2)
1
遇到数字直接入队
20-5+((2-10*5)+5-10*2)
/
栈空,运算符入栈
-5+((2-10*5)+5-10*2)
120
5+((2-10*5)+5-10*2)
-
120/
-的优先级低于/
+((2-10*5)+5-10*2)
120/5-
((2-10*5)+5-10*2)
+
-与+运算符的优先级相同,则先出栈,在入栈
(2-10*5)+5-10*2)
+(
遇到(,直接入栈
2-10*5)+5-10*2)
+((
同上
-10*5)+5-10*2)
120/5-2
10*5)+5-10*2)
+((-
因为(在栈里,(的优先级最低
*5)+5-10*2)
120/5-210
5)+5-10*2)
+((-*
*的优先级高于-,入栈
)+5-10*2)
120/5-2105
+5-10*2)
+(
120/5-2105*-
遇到),则把第一个(之前的所有运算符弹出入队,并出栈(
5-10*2)
+(+
-10*2)
120/5-2105*-5
10*2)
+(-
120/5-2105*-5+
优先级相等的运算符弹出入队,-入栈
*2)
120/5-2105*-5+10
2)
+(-*
*优先级高于-,入栈
)
120/5-2105*-5+102
120/5-2105*-5+102*-+
遇到),弹出所有运算符,并且中缀表达式到达结尾,弹出所有运算符
表3后缀表达式计算例子
120/5-2105*-5+102*-+后缀表达式计算
遇到数字就压栈,只要遇到运算符就把栈中的两个数字拿出来运算,把运算结果再压到栈中
stringQueueBack(后缀表达式队列)
20/5-2105*-5+102*-+
数字则入栈
/5-2105*-5+102*-+
遇到运算符,则把栈顶的两个数字弹出来运算,将运算结果压栈,1/20=00.5
5-2105*-5+102*-+
0.05
-2105*-5+102*-+
0.055
先弹出来的作为右运算数(0.05-5)
2105*-5+102*-+
-4.95
105*-5+102*-+
-4.952
5*-5+102*-+
-4.95210
*-5+102*-+
-4.952105
弹出10*5,计算结果50入栈
-5+102*-+
-4.95250
弹出2-50,计算结果-48入栈
5+102*-+
-4.95-48
+102*-+
-4.95-485
102*-+
-4.95-43
2*-+
-4.95-4310
*-+
-4.95-43102
-+
-4.95-4320
-4.95-63
-67.95
注:
空白处步骤类似,不再赘述
运行结果如下图所示:
附录
用户使用手册
1、根据提示,输入一条计算式即可。
2、开头无法输入负数,否则程序会崩溃。
3、输入的计算式需正确,否则会崩溃
程序源代码
#include<
iostream>
stack>
queue>
string>
cctype>
stdio.h>
stdlib.h>
#pragmawarning(disable:
4996)
usingnamespacestd;
classExpression
{
public:
voidsetExpression();
//从屏幕获取一行计算式子
voidcalculationResult();
//计算出结果,并输出
private:
voidtransformation();
//将中缀表达式转换成后缀表达式
stack<
stringStack;
//栈
queue<
stringQueueMiddle;
//存储中缀表达式的队列
stringQueueBack;
//存储后缀表达式的队列
};
voidExpression:
:
setExpression()
charch[200];
stringstr;
//获取屏幕的表达式
stringstrNumber;
//暂时存储数字
stringstrSymbol;
//暂时存储运算符
inti=0;
cout<
<
"
请输入一个表达式(不需要输入=,请不要输入无谓的字符隔开,比如空格):
"
<
endl;
\t"
;
cin.getline(ch,200);
str=ch;
for(i=0;
i<
str.size();
i++){
if(str[i]>
='
0'
&
str[i]<
9'
||'
.'
==str[i]){
strNumber+=str[i];
}
else{
stringQueueMiddle.push(strNumber);
//将数字添加到队列
strNumber.clear();
//清空字符串
strSymbol+=str[i];
stringQueueMiddle.push(strSymbol);
//将符号添加到队列
strSymbol.clear();
}
//将最后一个数字添加到队列
stringQueueMiddle.push(strNumber);
strNumber.clear();
transformation();
}
transformation()
for(;
!
stringQueueMiddle.empty();
stringQueueMiddle.pop()){
if(isdigit(stringQueueMiddle.front()[0]))//判断该字符串的第一个字符是否为数字
stringQueueBack.push(stringQueueMiddle.front());
//纯数字则将该字符串添加到后缀表达式队列
elseif(stringStack.empty()||'
('
==stringQueueMiddle.front()[0])
stringStack.push(stringQueueMiddle.front());
//如果栈空或者遇到(,则直接进栈
elseif('
+'
==stringQueueMiddle.front()[0]||'
-'
==stringQueueMiddle.front()[0]){
if(!
stringStack.empty()&
'
*'
==stringStack.top()[0]||'
/'
==stringStack.top()[0]){//栈不空,则栈中有*/则出栈
//栈中只要有连续的+-*/就出栈,且栈不能为空,遇到(也不出栈
for(;
'
!
=stringStack.top()[0];
stringStack.pop())
stringQueueBack.push(stringStack.top());
//*/进入后缀表达式队列
}
elseif(!
stringStack.empty()&
==stringStack.top()[0]||'
==stringStack.top()[0]){//如果遇到同等级的运算符,则先出栈再进栈
stringQueueBack.push(stringStack.top());
stringStack.pop();
//栈顶出栈
//+-优先级低,直接进栈
//进后缀表达式的队
//进栈
)'
==stringQueueMiddle.front()[0]){//遇到右括号,则左括号之前的运算符都弹出
for(;
stringStack.pop())
//运算符依次进入后缀表达式队列
stringStack.pop();
//弹出(
stringStack.empty();
stringStack.pop()){//中缀表达式扫描完毕,则栈中的所有运算符弹出
if('
=stringStack.top()[0])
stringQueueBack.push(stringStack.top());
//将栈中的运算符添加到后缀表达式队列
calculationResult()
doubleback=0.0;
//记录第一个从栈顶弹出来的元素
doublefront=0.0;
//记录第二个从栈顶弹出来的元素
doubleresult=0.0;
//记录运算结果
charch[100];
stringQueueBack.empty();
stringQueueBack.pop()){
if(isdigit(stringQueueBack.front()[0]))//判断该字符串的第一个字符是否为数字
stringStack.push(stringQueueBack.front());
//纯数字则将该字符串进栈
else{//遇到运算符
switch(stringQueueBack.front()[0])
{
case'
back=atof(stringStack.top().c_str());
//弹出第一个栈顶元素
front=atof(stringStack.top().c_str());
//弹出第二个栈顶元素
result=front+back;
sprintf(ch,"
%lf"
result);
//将浮点数转换成字符串
str=ch;
stringStack.push(str);
break;
result=front-back;
result=front*back;
result=front/back;
default:
\t="
stringStack.top()<
endl;
//栈只剩下一个结果,直接输出即可
intmain(void)
Expressione;
e.setExpression();
e.calculationResult();
return0;
附件
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 计算 数学 算式 完整 源码 附件