简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 11955    Accepted Submission(s): 3896
Problem Description
读入一个仅仅包括 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
 
Input
測试输入包括若干測试用例。每一个測试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中仅仅有0时输入结束。对应的结果不要输出。
 
Output
对每一个測试用例输出1行,即该表达式的值,精确到小数点后2位。

 
Sample Input
1 + 2
4 + 2 * 5 - 7 / 11
0
 
Sample Output
3.00
13.36

关键地方是在把中缀式转换成后缀式时要保持符号栈从顶開始严格递减,否则先出栈,再进栈。

#include <stdio.h>
#include <string.h>
char str[202], buf[202], sign[202]; //buf存储逆波兰式
double stack[202], a;
int len, n, id, id2, id3, id4; double perform(double x, double y, char ch){
if(ch == '*') return x * y;
if(ch == '/') return x / y;
if(ch == '+') return x + y;
return x - y;
} void check(char ch){
buf[id2++] = ' ';
if(ch == '*' || ch == '/'){
while(id3 && (sign[id3-1] == '*' || sign[id3-1] == '/'))
buf[id2++] = sign[--id3];
sign[id3++] = ch;
return;
}
while(id3) buf[id2++] = sign[--id3];
sign[id3++] = ch;
} int main(){
while(gets(str)){
len = strlen(str);
if(len == 1 && str[0] == '0') break;
id = id2 = id3 = id4 = 0;
for(int i = 0; i < len; ++i){
if(str[i] == ' ') continue;
if(str[i] >= '0' && str[i] <= '9'){
buf[id2++] = str[i];
}else check(str[i]);
}
while(id3) buf[id2++] = sign[--id3];
//for(int i = 0; i < id2; ++i) putchar(buf[i]);
for(int i = 0; i < id2; ++i){
if(buf[i] == ' ') continue;
if(buf[i] >= '0' && buf[i] <= '9'){
sscanf(buf + i, "%lf%n", &stack[id4++], &n);
i += n - 1;
}else stack[id4-2] = perform(stack[id4-2], stack[id4-1], buf[i]), --id4;
} printf("%.2lf\n", stack[0]);
}
return 0;
}

2014-11-3 21:55:30更新

#include <stdio.h>
#include <string.h> #define maxn 1000 char buf[maxn], out[maxn], stack[maxn];
int id, id1, ida;
double A[maxn]; int level(char ch) {
if(ch == '+' || ch == '-') return 1;
return 2;
} void check(char ch) {
while(id1 && level(stack[id1-1]) >= level(ch)) {
out[id++] = stack[--id1];
}
stack[id1++] = ch;
} double cal(double a, double b, char ch) {
if(ch == '-') return a - b;
if(ch == '+') return a + b;
if(ch == '*') return a * b;
return a / b;
} int main() {
int i, n;
bool sign;
double a;
while(gets(buf)) {
if(strlen(buf) == 1 && buf[0] == '0')
break;
id = id1 = 0; sign = 0;
for(i = 0; buf[i]; ++i) {
if(buf[i] == ' ') continue;
if(buf[i] >= '0' && buf[i] <= '9' || buf[i] == '.') {
if(sign) {
out[id++] = ' ';
sign = 0;
}
out[id++] = buf[i];
}
else sign = 1, check(buf[i]);
} while(id1) {
out[id++] = stack[--id1];
} for(i = ida = 0; i < id; ++i) {
if(out[i] == ' ') continue;
if(out[i] >= '0' && out[i] <= '9' || out[i] == '.') {
sscanf(out + i, "%lf%n", &a, &n);
A[ida++] = a; i += n - 1;
} else A[ida-2] = cal(A[ida-2], A[ida-1], out[i]), --ida;
} printf("%.2lf\n", A[0]);
}
return 0;
}

最新文章

  1. 设计模式--组合模式Composite(结构型)
  2. 【记录】ASP.NET MVC JsonResult JsonRequestBehavior AllowGet
  3. Atitit jsr规范化分类 attilax总结
  4. VS Code First使用Mysql数据库详解
  5. ASP.NET Core重写个人博客站点小结
  6. malloc心得
  7. zoj 3627 Treasure Hunt II (贪心)
  8. JavaScript原型模式
  9. cocod2d-x 之 HelloWorld
  10. 一个用 js 实现点阵图的编辑器演示
  11. DWR3.0 服务器推送及解惑
  12. OAuth2.0学习(1-7)授权方式4-客户端模式(Client Credentials Grant)
  13. VK Cup 2017 - Квалификация 1
  14. Serial Splitter 4.2 串口拆分说明
  15. JavaScript Constructor &amp; prototype
  16. C++中1/0和1/0.0的区别
  17. 20155308『网络对抗技术』Exp7:网络欺诈防范
  18. React Webpack cookbook
  19. MPVUE多环境定义后台URL
  20. 团队第一次作业 ——404 Note Found 团队

热门文章

  1. linux 添加 msyql 开机自启动
  2. shp系列(六)——利用C++进行Dbf文件的写(创建)
  3. 前端面试基础-html篇之CSS3新特性
  4. golang new和make的区别
  5. DP:***24种设计模式--转自刘伟
  6. 4 Python+Selenium的元素定位方法(link/partial link)
  7. .bat 打开程序
  8. (转)基于MVC4+EasyUI的Web开发框架形成之旅--MVC控制器的设计
  9. 基于Nginx的SSL虚拟主机
  10. 后代children() find()的区别