题目链接

#include<stdio.h>      //中缀表达式求值
#include<string.h>
#include<stdlib.h>
#define MAX 600char Infix[MAX];
char Postfix[2 * MAX];      //在操作数及操作符之后都加一个空格int StrToInt(char *s, int begin, int end) //字符串转化为int型数据,处理操作数为多位数的情形
{int i, sum = 0;for (i = begin; i < end; i++)sum = sum * 10 + s[i] - '0';return sum;
}void Transfer()        //将中缀表达式转化为后缀表达式
{char stack[MAX];int top = -1, i, j;int InfixLen = strlen(Infix);for (i = 0, j = 0; i < InfixLen; i++){switch (Infix[i]){case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':Postfix[j++] = Infix[i];if (i + 1 < InfixLen&&!(Infix[i + 1] >= '0'&&Infix[i + 1] <= '9')) //下一位不是数字,则在其后补空格' '{Postfix[j++] = ' ';}if (i + 1 == InfixLen) Postfix[j++] = ' ';           //最后一位数字之后加空格break;case '+':case '-':if (top == -1){stack[++top] = Infix[i];}else{while (top > -1 && stack[top] != '(')     //弹栈直至栈空或遇到左括号{Postfix[j++] = stack[top--];Postfix[j++] = ' ';                      //操作符后补空格}stack[++top] = Infix[i];       //当前操作符入栈}break;case '*':case '/':if (top == -1){stack[++top] = Infix[i];}else{while (top > -1 && stack[top] != '('&&stack[top] != '+'&&stack[top] != '-')//弹栈直至遇到比当前操作符优先级低的操作符或栈空或左括号{Postfix[j++] = stack[top--];Postfix[j++] = ' ';}stack[++top] = Infix[i];}break;case '(':stack[++top] = Infix[i];          //左括号直接入栈break;case ')':while (top > -1 && stack[top] != '(')   //遇到右括号将栈中操作符出栈直至遇到左括号{Postfix[j++] = stack[top--];Postfix[j++] = ' ';}if (top == -1){printf("右括号多余,输入的表达式不合法\n");exit(0);}elsetop--;        //将左括号出栈break;default:printf("输入的中缀表达式中有非法的字符出现\n");exit(0);}}while (top > -1 && stack[top] != '(')     //栈中剩余操作符出栈{Postfix[j++] = stack[top--];Postfix[j++] = ' ';}Postfix[--j] = '\0';                     //!重要!将Postfix的最后一位的空格赋值为'\0',以示字符串结尾if (top > -1 && stack[top] == '('){printf("左括号多余,输入的表达式不合法\n");exit(0);}
}int Compute(char op, int num1, int num2)           //计算num1(op)num2
{switch (op){case '+':return (num1 + num2);break;case '-':return (num1 - num2);break;case '*':return (num1 * num2);break;case '/':if (num2 == 0){printf("0不能做除数,非法!\n");exit(0);}return (num1 / num2);break;}
}int Calculator()           //计算后缀表达式的值
{int stack[MAX];int top = -1;int PostfixLen, i, begin, end;int num1, num2;PostfixLen = strlen(Postfix);for (i = 0; i < PostfixLen; i++){if (Postfix[i] >= '0'&&Postfix[i] <= '9'){begin = i;while (Postfix[i] >= '0'&&Postfix[i] <= '9')i++;end = i;            //此时的i为Postfix中空格的地址,执行下一次循环i++刚好跳过空格stack[++top] = StrToInt(Postfix, begin, end);}else{if (top > -1) num2 = stack[top--];                 //弹栈出操作数2else printf("ERROR!\n");if (top > -1) num1 = stack[top--];                   //弹栈出操作数1else printf("ERROR!\n");stack[++top] = Compute(Postfix[i], num1, num2);       //将结果入栈i++;               //此时为空格地址}}return stack[top];
}int main()
{int n;scanf("%d", &n);while (n--){scanf("%s", Infix);Transfer();
//      puts(Postfix);printf("%d\n", Calculator());}return 0;
}

DSOJ 中缀表达式求值相关推荐

  1. leetcode 282. Expression Add Operators | 282. 给表达式添加运算符(中缀表达式求值)

    题目 https://leetcode.com/problems/expression-add-operators/description/ 题解 中缀表达式求值问题,参考:leetcode 227. ...

  2. leetcode 224. Basic Calculator | 224. 基本计算器(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator/ 题解 中缀表达式求值,之前学数据结构的笔记: class Solution {public int ...

  3. leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)

    题目 https://leetcode.com/problems/basic-calculator-ii/ 题解 这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起 ...

  4. C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式)

    C++代码实现中缀表达式求值(基于中缀表达式转后缀表达式) 样例输入:3*(2+5) 样例输出:21 代码:#include <bits/stdc++.h> using namespace ...

  5. Python实现中缀表达式求值

    一.思路 有些类似于先把中缀表达式转化为后缀表达式,然后再对后缀表达式求值.但是因为我们最终只需要求出来的值,不想得到后缀表达式,所以就一边遍历一边计算了.关键点在于,我们借助两个栈,一个栈存放操作数 ...

  6. 栈应用:中缀表达式求值

    后缀表达式求值比较简单,基本过程为:遇到数字则进栈,遇到运算符则出栈俩数字然后计算结果,再把结果入栈,过程比较简单,不再复习了,下面着重记录中缀表达式求值 中缀表达式求值可以先将中缀转后缀,再用后缀计 ...

  7. c语言中缀表达式求值_数据结构考研笔记之栈与队列(四)栈与队列应用括号匹配、中缀表达式转前缀后缀问题...

    文字:独木 排版:独木 图片:独木 栈与队列 1.括号匹配问题 栈 例题1 例题2-----不匹配例题1 例题3-----不匹配例题2 2. 表达式求值问题 例题 1.中缀表达式转前缀表达式 2.中缀 ...

  8. c语言中缀表达式求值_数据结构-第三章:栈和队列(栈的应用、括号匹配、表达式转换)

    第三章:栈和队列 下面讲解栈的应用主要内容有:栈的应用.括号匹配.中 后 前 缀表达式转换 1.栈的应用 1.1括号匹配 我们在数学运算中 [(A+b)*c] - (E-F) 往往都会有[ ] 和 ( ...

  9. c语言中缀表达式求值_[源码和文档分享]基于C++的表达式计算求值

    一.使用说明 1.1 项目简介 表达式求值是程序设计语言编译中的一个最基本的问题,就是将一个表达式转化为逆波兰表达式并求值.具体要求是以字符序列的形式从终端输入语法正确的.不含变量的整数表达式,并利用 ...

最新文章

  1. 动图与数据同步关系研究
  2. anaconda3配置环境变量_阿里云ECS配置Jupyter Notebook
  3. 「第四篇」电赛控制题可以准备一些什么?
  4. python数字信号处理应用中文pdf_人邮新书 Python数字信号处理应用 Python在DSP中应用教程 Python基础 Pytho...
  5. C1. 组队活动 Small(BNUOJ)
  6. crontab -e 怎么保存后退出?
  7. 转载 — 问题解决:Unlink of file '.git/objects/pack/pack-***.pack' failed. Should I try again? (y/n) y
  8. #华为云·寻找黑马程序员#【代码重构之路】使用Pattern的正确姿势
  9. 怎么在虚拟机上安装linux mint,如何在VirtualBox上安装Linux Mint?
  10. 小巧实用的节拍器软件FineMetronome介绍 原创
  11. 修改配置文件,编译freeswitch支持H264
  12. JSONObject.toBean方法复制不成功
  13. DirectX12(D3D12)基础教程(十八)—— PBR基础从物理到艺术(中)
  14. 使用 Onedrive 来同步Mac 桌面
  15. python3报错: takes 1 positional argument but 2 were given 问题解决。
  16. 关于echarts人物关系图,节点展现为图片
  17. 给俺的 CSDN 博客加背景音乐 - 高大尚的《心经》背景音乐
  18. 成为黑客需要学习什么技能?
  19. Visual Studio2022编译报错解决方法
  20. The requested resource is not available.

热门文章

  1. python的持久化存储文件操作
  2. 2019年最好的11本JavaScript书籍
  3. Android禁止安装三方应用(屏蔽所有安装应用的方式)
  4. am335x omap serial 驱动分析
  5. C# 第七章『I/O数据流』◆第4节:数据流—FileStream 类
  6. BigDecimal 类型 比较大小
  7. 关于QQ号16进制登录失败
  8. 【理解】制表符 \t
  9. # 陌生人社交产品:需求、困境与破局之道
  10. 下载工具-谷歌插件 tampermonkey 和 greasyfork