逆波兰计算器
2017-01-09 14:44
162 查看
1.逆波兰表达式用途
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*
2.逆波兰表达式逻辑实现
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
3.为啥要用逆波兰表达式
例如(a+b)*(c+d)转换为ab+cd+* 计算机在计算普通表达式时,要对运算优先级用递归进行判断,对于更为复杂的表达式会使计算机运算效率变低甚至崩溃。而逆波兰表达式只需要进行简单的入栈出栈操作就可以完成任何普通表达式的运算。
4.普通表达式——>逆波兰表达式
(1) a+b——>a b +
(2) a+(b-c)——>a
b c - +
(3)a+(b-c)*d——>a
b c - d * +
5.逆波兰表达式运用的小例子
逆波兰表达式是一种十分有用的表达式,它将复杂表达式转换为可以依靠简单的操作得到计算结果的表达式。例如(a+b)*(c+d)转换为ab+cd+*
2.逆波兰表达式逻辑实现
如果当前字符为变量或者为数字,则压栈,如果是运算符,则将栈顶两个元素弹出作相应运算,结果再入栈,最后当表达式扫描完后,栈里的就是结果。
3.为啥要用逆波兰表达式
例如(a+b)*(c+d)转换为ab+cd+* 计算机在计算普通表达式时,要对运算优先级用递归进行判断,对于更为复杂的表达式会使计算机运算效率变低甚至崩溃。而逆波兰表达式只需要进行简单的入栈出栈操作就可以完成任何普通表达式的运算。
4.普通表达式——>逆波兰表达式
(1) a+b——>a b +
(2) a+(b-c)——>a
b c - +
(3)a+(b-c)*d——>a
b c - d * +
5.逆波兰表达式运用的小例子
#include <stdio.h> #include<cstdlib> #include <ctype.h>//isdigit #define STACK_INIT_SIZE 20 #define STACKINCREMENT 10 #define MAXBUFFER 10 typedef double ElemType; typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack; void InitStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType)); if (!s->base) { exit(0); } s->top = s->base; s->stackSize = STACK_INIT_SIZE; } //PUSH操作 void Push(sqStack *s, ElemType e) { if (s->top - s->base >= s->stackSize) { s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT)*sizeof(ElemType)); if (!s->base) { exit(0); } s->top = s->base + s->stackSize; s->stackSize = s->stackSize + STACKINCREMENT; } *(s->top) = e; s->top++; } void Pop(sqStack *s, ElemType *e) { if (s->top == s->base) { return; } *e = *--(s->top); } int StackLen(sqStack s) { return(s.top - s.base); } int main() { sqStack s; int i = 0; char c; double d, e; char str[MAXBUFFER]; InitStack(&s); printf("请按逆波兰表达式输入数据,数据与运算符之间用空格隔开,按!结束\n"); scanf("%c", &c); while (c != '!') { while (isdigit(c) || c == '.') { str[i++] = c; //str[i] = '\0'; if (i >= 10) { printf("输入的单个数据过大"); return -1; } scanf("c", &c); if (c == ' ') { d = atof(str); Push(&s, d); i = 0; break; } } switch (c) { case '+': Pop(&s, &e); Pop(&s, &d); Push(&s, d + e); break; case '-': Pop(&s, &e); Pop(&s, &d); Push(&s, d - e); break; case '*': Pop(&s, &e); Pop(&s, &d); Push(&s, d * e); break; case '/': Pop(&s, &e); Pop(&s, &d); if (e != 0) { Push(&s, d / e); } else { printf("除数为0"); return -1; } break; } scanf("%c", &c); } Pop(&s, &d); printf("\n最终的计算结果为:%f\n", d); return 0; }
相关文章推荐
- 程序员面试金典: 9.9 递归和动态规划 9.6打印n对括号的全部有效组合
- DIV水平垂直居中的CSS兼容写法
- python 调用pymysql模块遇到\转义问题解决办法
- xshell项目启动基本配置
- Aerospike数据库实战(五) -- Aerospike C Client 开发
- 几个简单的导航布局
- Swift的PullReTofresh
- Java集合库整体类结构
- domain、entity和model的package的不同用法
- 微信小程序开发之Tabbar实例详解
- 关于分布式系统的数据一致性问题(四)
- vim强大探究之光标移动
- 欢迎使用CSDN-markdown编辑器
- 小程序中接入微信支付完整教程
- mybatis-generator最详细的配置详解
- redis并发处理慢
- struts2+spring+mybatis
- [Android 知识点] 自定义View(二)
- Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use.
- 每天一个linux命令——cat