当前位置: 首页 > news >正文

栈实现四则运算

栈实现四则运算

#include <ctype.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义运算符优先级
int precedence(char op) {if (op == '+' || op == '-')return 1;if (op == '*' || op == '/')return 2;if (op == '^')return 3;return 0;
}// 执行基本运算
int applyOp(int a, int b, char op) {switch (op) {case '+':return a + b;case '-':return a - b;case '*':return a * b;case '/':return a / b;case '^':return (int)pow(a, b);}return 0;
}// 计算表达式
int evaluate(char* tokens) {int i;// 栈用于存储操作数int values[100];int valuesTop = -1;// 栈用于存储操作符char ops[100];int opsTop = -1;//负号的处理int flag =1;for (i = 0; i < strlen(tokens); i++) {// 如果当前字符是空格,跳过if (tokens[i] == ' ')continue;else if ((i==0 && tokens[i]=='-')|| !isdigit(tokens[i-1])&& tokens[i]=='-'){flag=-1;}// 当前字符是数字, 推入值堆栈else if (isdigit(tokens[i])) {int val = 0;// 处理多位数while (i < strlen(tokens) && isdigit(tokens[i])) {val = (val * 10) + (tokens[i] - '0');i++;}values[++valuesTop] = val*flag;flag = 1;i--;}// 当前字符是左括号, 推入ops栈else if (tokens[i] == '(') {ops[++opsTop] = tokens[i];}// 当前字符是右括号else if (tokens[i] == ')') {while (opsTop != -1 && ops[opsTop] != '(') {int val2 = values[valuesTop--];int val1 = values[valuesTop--];char op = ops[opsTop--];values[++valuesTop] = applyOp(val1, val2, op);}// 弹出左括号opsTop--;}// 当前字符是运算符else {while (opsTop != -1 &&precedence(ops[opsTop]) >= precedence(tokens[i])) {int val2 = values[valuesTop--];int val1 = values[valuesTop--];char op = ops[opsTop--];values[++valuesTop] = applyOp(val1, val2, op);}ops[++opsTop] = tokens[i];}}// 处理剩余的操作符while (opsTop != -1) {int val2 = values[valuesTop--];int val1 = values[valuesTop--];char op = ops[opsTop--];values[++valuesTop] = applyOp(val1, val2, op);}return values[valuesTop];
}int main() {char expression[100];printf("请输入表达式(以=结束):");fgets(expression, sizeof(expression), stdin);// 移除换行符和等号int len = strlen(expression);if (expression[len - 1] == '\n')expression[len - 1] = '\0';if (expression[len - 1] == '=')expression[len - 1] = '\0';// 计算表达式int result = evaluate(expression);printf("结果为:%d\n", result);return 0;
}

相关文章:

  • 视频讲解|基于模型预测算法的含储能微网双层能量管理模型【mpc】
  • C++初学者指南第一步---12.引用
  • 破碎的像素地牢探险:游戏分享
  • Python爬虫学习 | Scrapy框架详解
  • 逆向学习COM篇:通过注册表管理COM组件
  • 9. 文本三剑客之awk
  • 【设计模式之模板方法模式 -- C++】
  • 模拟面试三
  • spring-websocket实现(一)
  • TPS、QPS、CPS、PV和UV
  • 『FPGA通信接口』LVDS接口(4)LVDS接收端设计
  • 1095 解码PAT准考证(测试点3)
  • 海外短剧系统如何征服观众心
  • Docker可视化web工具
  • 工业web4.0UI风格令人惊艳
  • C# 免费离线人脸识别 2.0 Demo
  • Idea+maven+scala构建包并在spark on yarn 运行
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • PHP的类修饰符与访问修饰符
  • React+TypeScript入门
  • spring security oauth2 password授权模式
  • STAR法则
  • win10下安装mysql5.7
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 解析带emoji和链接的聊天系统消息
  • 前端学习笔记之观察者模式
  • 前端之React实战:创建跨平台的项目架构
  • 巧用 TypeScript (一)
  • 详解NodeJs流之一
  • const的用法,特别是用在函数前面与后面的区别
  • ionic异常记录
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​如何使用QGIS制作三维建筑
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #include
  • %@ page import=%的用法
  • (3) cmake编译多个cpp文件
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (七)Activiti-modeler中文支持
  • (转)C#调用WebService 基础
  • (转)fock函数详解
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net MySql
  • .net 提取注释生成API文档 帮助文档
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • @Conditional注解详解
  • [<MySQL优化总结>]
  • [20180224]expdp query 写法问题.txt
  • [30期] 我的学习方法