博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单计算器(非常简便)
阅读量:6863 次
发布时间:2019-06-26

本文共 1650 字,大约阅读时间需要 5 分钟。

题目描述:
    读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
    测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
    对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 24 + 2 * 5 - 7 / 110
样例输出:
3.0013.36

 

 

解题思路:这道题因为是没有括号的,因而建立一个栈,若遇到加号把数字入栈,若遇到减号则转换为负数后入栈,若遇到乘除则就近直接计算后再把数值写回栈尾。最后再将栈内数字全部相加得到最后的结果。

                    不得不说这样做非常巧妙,不用像传统的做法那样创建一个栈保存运算符,比起王道书上的标准答案代码量也小了很多

1 #include 
2 #include
3 4 double ans[1002]; 5 int tail; //尾数下标 6 7 int main() 8 { 9 int temp1,temp2;10 int i;11 char c1,c2;12 double ret;13 14 while( scanf("%d%c",&temp1,&c2)!=EOF )15 {16 if( temp1==0 && c2=='\n') break; //如果输入只有0时结束17 tail = 0; //注意每次都要置018 ret = 0; //注意每次都要置019 ans[++tail] = 1.0*temp1; //转换为浮点数20 while(scanf("%c %d%c",&c1,&temp2,&c2)!=EOF)21 {22 if( c1=='+')23 {24 ans[++tail] = 1.0*temp2; //如果是加号直接入栈25 }26 else if( c1=='-')27 {28 ans[++tail] = -1.0*temp2; //如果是负号转换为负数再入栈29 }30 else if( c1=='*')31 {32 ans[tail] *= temp2; //如果是乘号则更新栈尾数33 34 }35 else if( c1=='/'&&temp2!=0)36 {37 ans[tail] /= temp2; //如果是除号则更新栈尾数38 }39 else break;40 if( c2!=' ') break; //如果最后一个字符不是空格则输入结束41 }42 for( i=1; i<=tail; i++)43 {44 ret += ans[i]; //把栈里头的东西全部加起来,求和45 }46 printf("%.2lf\n",ret);47 }48 49 return 0;50 }

 

转载于:https://www.cnblogs.com/yuxiaoba/p/8434749.html

你可能感兴趣的文章
Springboot的热部署
查看>>
Thinking in UML-1-为什么需要UML
查看>>
vs编译obj给delphi用
查看>>
过游戏保护NP或TP的几种方法和思路
查看>>
equals和hashcode为什么要一起重写
查看>>
模态与非模态对话框的问题
查看>>
地对地导弹地对地导弹地对地导弹
查看>>
让div 充满整个body
查看>>
程序员保持快乐活跃的6个好习惯(转)
查看>>
找工作的一些感悟——前端小菜的成长
查看>>
jSON Call can throw but it is not marked with try
查看>>
Javascript图片裁切
查看>>
Android -- Serializable和Parcelable需要注意的
查看>>
Apache -- phpmyadmin导入文件过大
查看>>
我的友情链接
查看>>
一分钟看懂Docker的网络模式和跨主机通信
查看>>
数据中悲观锁和乐观锁的理解
查看>>
能想到登录失败是这原因么
查看>>
Shiro 权限管理filterChainDefinitions过滤器配置
查看>>
我的友情链接
查看>>