C语言中缀表达式计算器
时间:2022-07-25
本文章向大家介绍C语言中缀表达式计算器,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文将介绍中缀表达式计算器的详细写法,是C语言把中缀表达式转换为后缀表达式和C语言逆波兰计算器的结合 但本篇用了更精简的写法,但是也相对的提高了代码的理解难度,在阅读时,需自己详细斟酌
开始
添加适当的头文件
c语言的头文件比不可少,我们这里还是添加适当的头文件和宏定义并声明函数
#include <stdio.h>
#include <stdlib.h>
#define MAX_LEN 80
void convert2postfix(char *src, char *dst);
float cal(char *src);
中缀表达式转换为后缀表达式(操作符与操作数之间应有空格隔开)
这里是另一种方式的中缀表达式转后缀表达式,还有一种方式更容易理解一点,但是代码量相对更多,详情可见C语言把中缀表达式转换为后缀表达式
void convert2postfix(char *src, char *dst) {
char *psrc, *pdst;
char stack[MAX_LEN];
int top;
top = -1;
psrc = src;
pdst = dst;
while (*psrc != ' ') {
if (*psrc >= '0' && *psrc <= '9') {
*pdst = *psrc;
pdst++;
//加入分隔空格
if (!(*(psrc + 1) >= '0' && *(psrc + 1) <= '9') && *(psrc + 1) != '.') {
*pdst = ' ';
pdst++;
}
}
if (*psrc == '.') {
*pdst = *psrc;
pdst++;
}
if (*psrc == '(') {
stack[++top] = *psrc;
}
if (*psrc == ')') {
while (stack[top] != '(') {
*pdst = stack[top--];
pdst++;
//加入分隔空格
*pdst = ' ';
pdst++;
}
//弹出'('
top--;
}
if (*psrc == '*' || *psrc == '/') {
if (stack[top] == '*' || stack[top] == '/') {
*pdst = stack[top--];
pdst++;
//加入分隔空格
*pdst = ' ';
pdst++;
}
stack[++top] = *psrc;
}
if (*psrc == '+' || *psrc == '-') {
while (stack[top] == '*'
|| stack[top] == '/'
|| stack[top] == '+'
|| stack[top] == '-') {
*pdst = stack[top--];
pdst++;
//加入分隔空格
*pdst = ' ';
pdst++;
}
stack[++top] = *psrc;
}
psrc++;
}
//扫描完成后,取出栈中所有运算符,写入后缀表达式数组。
while (top != -1) {
*pdst = stack[top--];
*pdst++;
*pdst = ' ';
pdst++;
}
*pdst = ' ';
}
}
计算后缀表达式
同上还有另一种比较好理解的方式 见C语言逆波兰计算器
float cal(char *src) {
float stack[MAX_LEN];
float opd1, opd2;
int top;
char *p, *pre;
top = -1;
p = src;
while (*p != ' ') {
if (*p >= '0' && *p <= '9') {
pre = p;
while ((*p >= '0' && *p <= '9') || *p == '.') {
p++;
}
*p = ' ';
stack[++top] = atof(pre);
}
if (*p == '+' || *p == '-' || *p == '*' || *p == '/') {
opd2 = stack[top--];
opd1 = stack[top--];
switch (*p) {
case '+':
stack[++top] = opd1 + opd2;
break;
case '-':
stack[++top] = opd1 - opd2;
break;
case '*':
stack[++top] = opd1*opd2;
break;
case '/':
//更严格一点,应该处理除数为0的情况
stack[++top] = opd1 / opd2;
break;
}
}
p++;
}
return stack[top--];
}
主函数
输入中缀表达式作为一个字符串,调用中缀表达式转换和后缀表达式计算便可以很容易得出结果。
nt main() {
char str1[MAX_LEN], str2[MAX_LEN];
float res;
gets(str1);
convert2postfix(str1, str2);
res = cal(str2);
printf("result:%.2fn", res);
return 0;
}
运行结果
本人用的是vs2015编译器,所以文中的scanf用了更安全的scanf_s,当然也可以用fgets 详情可以自行baidu或者Google (1+4)*(4-5)=-5 结果正确
注:
- 上述代码在visual studio 2015中编译成功运行,其他ide请自行测试
- 上述文字皆为个人看法,如有错误或建议请及时联系我
- 如何用六点教会老婆写 Python ?
- 连高晓松都想学的区块链江湖切口,「HODL」是什么意思?
- Spring Data REST 与 Spring RestTemplate 实战详解
- 程序员炒股,如何计算股票投资组合的风险和收益
- Docker 容器化部署运维 OpenStack 和 Ceph
- 关于设计模式的思考
- Spring 框架之 AOP 原理剖析
- Java 平台反应式编程(Reactive Programming)入门
- 从原理到实例,他用区块链技术做一了个COIN 客户端
- 解锁Spring Data Redis的正确使用姿势
- 互联网厂工必知必会:SQL基础篇
- 算法入门,其实可以像读小说一样有趣
- 互联网中小型企业的持续集成CICD
- Hybris平台Web架构模式演变:前后端分离
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kafka集群搭建
- Kafka的实现细节
- CentOS7下安装Elasticsearch-7.3.2和Elasticsearch-head
- spring boot oauth2 取消认证
- 日志级别记录规范
- 搭建K8S集群之node节点部署
- ent orm笔记2---schema使用(上)
- ent orm笔记4---Code Generation
- 什么?明明是2020年12月30日显示2021年12月30日?
- JDK1.8HashMap源码学习-数据结构
- JDK1.8HashMap源码学习-初始化
- JDK1.8HashMap源码学习-put操作以及扩容(一)
- 数据科学家极力推荐核心计算工具-Numpy的前世今生(上)
- 什么是运维眼中可部署的软件架构
- 2020-09-03:裸写算法:回形矩阵遍历。