HDU1237 简单计算器 【栈】+【逆波兰式】
简单计算器
1 + 2
4 + 2 * 5 - 7 / 11
0
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;
}
HDU1237 简单计算器 【栈】+【逆波兰式】的更多相关文章
- hdu-1237简单计算器(栈的运用)
http://acm.hdu.edu.cn/showproblem.php?pid=1237 简单的栈的运用. 首先将数字和运算符分离,分别保存在两个数组中,然后按原来的式子的顺序,首先将第一个数和第 ...
- HDU1237 简单计算器 栈
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1237 题目大意:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 题目分 ...
- HDU1237 简单的计算器 【堆】+【逆波兰式】
简单的计算器 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- hdu1237 简单计算器[STL 栈]
目录 题目地址 题干 代码和解释 参考 题目地址 hdu1237 题干 代码和解释 解本题时使用了STL 栈,要记得使用#include<stack>. 解本题时使用了isdigit()函 ...
- c# 逆波兰式实现计算器
语文不好,不太会组织语言,希望不要太在意. 如题,先简要介绍一下什么是逆波兰式 通常我们在写数学公式的时候 就是a+b+c这样,这种表达式称为中缀表达式,逆波兰式又称为后缀表达式,例如a+b 后缀 ...
- javascript:逆波兰式表示法计算表达式结果
逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 - 等价于 5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...
- [LeetCode]Evaluate Reverse Polish Notation(逆波兰式的计算)
原题链接:http://oj.leetcode.com/problems/evaluate-reverse-polish-notation/ 题目描述: Evaluate the value of a ...
- python 逆波兰式
逆波兰式,也叫后缀表达式 技巧:为简化代码,引入一个不存在的运算符#,优先级最低.置于堆栈底部 class Stack(object): '''堆栈''' def __init__(self): se ...
- codechef Transform the Expression 转换成逆波兰式
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/.未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
随机推荐
- BZOJ 2073
思路: 状压DP 枚举子集 //By SiriusRen #include <cstdio> #include <cstring> #include <algorith ...
- JAVA比较两张图相似度
代码: package com.uiwho.com; import javax.imageio.*; import java.awt.image.*; import java.awt.*;//Colo ...
- cropper+pillow处理上传图片剪裁(二)
上次说到处理上传头像的方法是临时保存在本地,其实这样做并不妥,而且修改后的头像重新上传到model中也很麻烦,差了很多资料,解决了这个问题 大致思路:用户上传原图和修改数据—PIL修改后将图片保存为内 ...
- NEFU 116 两仪剑法 【求最小公倍数】
题目链接:http://acm.nefu.edu.cn/JudgeOnline/status.php?problem_id=116&order=1 解题思路:求最小公倍数 #include&l ...
- JS操作DOM的一些常用方法
getElementById():获取有指定惟一ID属性值文档中的元素 getElementsByName(name):返回的是数组 getElementsByTagName():返回具有指定标签名的 ...
- 如何像Uber一样给工程师派单 解放外包落后的生产力
2014年,陈柯好的第一个创业项目失败,半年之内,陈柯好以技术合伙人的方式游走于旅游.电商.团购.票务等各种领域.正当他对职业方向感到迷茫时,“大众创业.万众创新”的口号被提了出来 一时间,技术需求被 ...
- type="radio"样式修改
input[type=radio],input[type=checkbox] { display: inline-block; vertical-align: middle; width: 20px; ...
- JXLS生成excel并自定义单元格样式
本人最近需要每天统计数据表,并每周一发送统计结果的邮件,所以写了个springboot老自动完成工作.项目地址为:https://github.com/707293891/springboot 其中某 ...
- 常用shell备份脚本
#!/bin/sh # File: /路径/mysql/backup_mydb.sh # Database info DB_NAME="szby" DB_USER="ro ...
- appium不能获取webview内容的解决办法
在用appium对小猿搜题app进行自动化测试时,准备用page_source打印出文章的xml内容 但是发现只能打印出外部结构内容,实际的文章内容却没有显示 截图如下 查询之后,得知需要通过cont ...