题目描述

在一个表达式中,只有“(”,“)”,“0-9”,“+”,“-”,“*”,“/”,“^”,请求出表达式的值。(“/”用整数除法)。

输入格式:

共1 行,为一个算式。 (算式长度<=30 其中所有数据在 0~2^31-1的范围内)。

输出格式:

共一行,为表达式的值。

输入样例:

在这里给出一组输入。例如:

1+(3+2)(7^2+69)/(2)

输出样例:

在这里给出相应的输出。例如:

258


基本思路:

读取完字符串之后,扫描一遍,扫描一遍后,运算也同时结束,过程中将中缀表达式转化成后缀表达式,一边转化,一边计算。
1.如果碰到了数字,开始往数字栈放数字(考虑多位数情况)
2.如果碰到了 “(” 直接入符号栈
3.如果碰到了运算符,如果其优先级大于符号栈顶元素优先级,入栈;
否则,先计算符号栈顶元素和数字栈顶两元素的运算结果
(特别的,如果数字栈内元素不足2,那么不论哪一种运算符都要直接入栈)
4.如果碰到了 “)” 开始从两个栈往外提取元素,进行计算,直到符号栈顶元素是 “(” ,计算结束后要把 “(” 也取出,表示这一对括号内的表达式已经计算成一个结果了
5.特别的,“^”的优先级要大于 “” 和 “/” (比较723和7 ^23的区别)
6.更多的细节在代码和注释中


代码

以下是我的代码,使用的是非常非常基础的方法,代码本身非常易懂,并适当进行了注释,对想了解一下这种问题解决思路的朋友比较合适:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>int in(char ch)//判断是否是数字 函数
{if(ch<='9'&&ch>='0'){return 1;}return 0;
}int cal(int a,char c,int b)//计算函数
{if(c=='*'){return a*b;}else if(c=='/'){return a/b;}else if(c=='-'){return a-b;}else if(c=='+'){return a+b;}else{return pow(a,b);}
}int com(char a,char b)//比较运算符优先级
{int x=0;//a的优先级 int y=0;//b的优先级 if(a=='+'||a=='-'){x=1;}else if(a=='*'||a=='/'){x=2;}else if(a=='^'){x=3;}else if(a=='('){x=4;}if(b=='+'||b=='-'){y=1;}else if(b=='*'||b=='/'){y=2;}else if(b=='^'){y=3;}else if(b=='('){y=4;}if(x>y)return 1;return 0;
}int main()
{char s[310];//主串 int num[310];//数字栈 char ch[310];//运算符栈 gets(s);int a,b;a=0;//数字栈的栈顶 b=0;//符号栈的栈顶 for(int i=0;i<310;i++){num[i]=0;ch[i]='0';}int i=0;while(i<strlen(s)){if(in(s[i])){while(in(s[i]))//如果是数字 进入数字栈  字符转化成数字 {num[a]=num[a]*10+s[i++]-'0';}a++;//printf("%d %d ",num[a-2],num[a-1]);//for(int k=0;k<b;k++)//{//  printf("%c ",ch[k]);                          //}//printf("\n");continue;}else{if(s[i]=='(')//如果是左括号 直接入栈 {ch[b++]=s[i];}else if(s[i]==')')//如果是右括号 开始计算括号内的表达式 {while(ch[b-1]!='(')//在找到相匹配的左括号之前 一直计算 {//printf("%d %d ",num[a-2],num[a-1]);//for(int k=0;k<b;k++)//{// printf("%c ",ch[k]);                          //}//printf("\n");num[a-2]=cal(num[a-2],ch[b-1],num[a-1]);//数字栈前面的数字更新为计算后的结果 num[a-1]=0;//数字栈顶元素用完之后要清零,否则影响之后的运算, 之前的转化数字循环开始时 num[a]=num[a]*10+s[i++]-'0'; 默认num[a]的初始值是0 b--;//符号栈退一格 a--;//数字栈退一格 }b--;//计算完括号内的式子后将左括号移除 }//如果是运算符 else{if(b==0)//如果符号栈为空,则直接入栈 {ch[b++]=s[i];}else if(com(s[i],ch[b-1])){//如果是当前运算符优先级比栈顶运算符优先级大 直接入栈 ch[b++]=s[i];}else //果是当前运算符优先级比栈顶运算符优先级小 说明可以进行计算了 {while(!com(s[i],ch[b-1])){if(ch[b-1]=='('){break;}//printf("%d %d ",num[a-2],num[a-1]);//for(int k=0;k<b;k++)//{// printf("%c ",ch[k]);                          //}//printf("\n");num[a-2]=cal(num[a-2],ch[b-1],num[a-1]);//数字栈前面的数字更新为计算后的结果 num[a-1]=0;b--;//符号栈退一格 a--;//数字栈退一格 if(b==0)break;//如果运算符栈为空,那没办法进行计算 直接跳出循环 }ch[b++]=s[i];//计算完成之后就可以让这个运算符进来了 }} }i++;} while(a!=1&&b>0)//在遍历了整个字符串之后如果两个栈还没有空  那么继续 (一旦数字栈里只剩一个数字 或者运算符栈没有符号了 那就停止计算){num[a-2]=cal(num[a-2],ch[b-1],num[a-1]);a--;b--;//因为不会再有新数字入栈了,所以不需要再num[a-1]=0; }printf("%d",num[0]);//输出结果
}

诶,对于一个对算法一窍不通的菜鸡而言这种题简直就是折磨,这里特别感谢两位大佬ATFWUS和sky~key的帮助

7-3 表达式求值_1 (20分) 简单代码相关推荐

  1. 表达式求值(最详细分析+代码实现+表达式之间的相互转换)

    目录 一.概念 二.前缀表达式的逻辑和实现方式 1.定义 2.前缀表达式的计算机求值 3.例子 4.代码实现 三.中缀表达式的逻辑和实现方式 1.定义 2.中缀表达式规则 3.中缀表达式的计算机求值 ...

  2. 计算器c语言代码中缀表达式,C语言实现中缀表达式求值,计算器的简单实现

    #include #include typedef struct//操作数栈 { double *top; double *base; int listsize; }List; typedef str ...

  3. 每天一道LeetCode-----后缀表达式求值

    Evaluate Reverse Polish Notation 原题链接Evaluate Reverse Polish Notation 后缀表达式求值,用栈即可 代码如下 class Soluti ...

  4. Suzy找到实习了吗Day 11 |栈与队列中途 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    Day 11 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值 20. 有效的括号 注意栈不是一个数据结构,需要自己用list实现栈的逻辑 class Solu ...

  5. 算法训练Day11|LeetCode 20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

    题目链接:20. 有效的括号 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false 第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字 ...

  6. 算法训练第十一天|力扣20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

    20. 有效的括号 题目链接:有效的括号 参考:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B ...

  7. 九、表达式求值(1)

    九.表达式求值(1) 文章目录 九.表达式求值(1) 题目描述 解题思路 上机代码 题目描述 背景: 我们的教材中已经介绍了表达式求值的算法,现在我们将该算法的功能进行扩展,要求可以处理的运算符包括: ...

  8. python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图

    python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...

  9. 四则运算表达式求值の各种心碎

    实验三---四则运算表达式求值 一.基本要求: ( 1 ) 利用二叉树后序遍历来实现表达式的转换,同时可以使用实验三的结果来求解后缀表达式的值. ( 2) 输入输出格式: 输入格式:在字符界面上输入一 ...

最新文章

  1. What?! Python一行代码,能玩这么多童年的游戏?
  2. 求 1-100 之间不能被 3 整除的数之和
  3. 【引用】jQuery 选择器
  4. NeurlPS 2019丨微软亚洲研究院 5 篇精选论文解读
  5. Maven学习总结(51)——Maven 常用属性和常量说明
  6. 想知道账号被封的感觉么?
  7. [SharePoint教程系列]安装之后的常见操作 如何打开管理中心
  8. Android ViewGroup中addView方法使用
  9. ESP8266制作创意时钟(DS1302+TM1637)
  10. 【Azure 应用服务】NodeJS Express + MSAL 实现API应用Token认证(AAD OAuth2 idToken)的认证实验 -- passport.authenticate()
  11. ansys 常见命令集合
  12. DOA定位算法源码程序
  13. 斜杠青年:如何开启你的多重身份 作者:Susan Kuang
  14. 西安电子科技大学计算机研究生工资,双一流高校本硕博毕业生,薪酬排名!西安电子科技大学全国第5!...
  15. C++数据结构——哈希表
  16. 魔众文库系统 v2.3.0 后台菜单快捷搜索,组件显示优化
  17. 无需客户端下载的方法/天翼云网页下载方法
  18. 单片机外围电路设计之六:场效应管
  19. 张亮上《大咖》秀美腿又卖萌 不再是丑女人
  20. 蒋鑫鹏:百度搜索算法总结—关键词分词算法

热门文章

  1. 安捷伦示波器DSO-X3034A进入不了测试界面是什么原因?
  2. 一步一步理解日历calendar(三)
  3. JAVA小实例(十五)
  4. ATtiny13与Proteus仿真-PWM生成报警声音仿真
  5. 计算机网络配置RIP路由协议,动态路由协议RIP配置,带你一分钟学会
  6. 应该担心什么不应该关心什么(做正确的事,把事情做对)
  7. 酷讯的今天应引起创业者警醒
  8. 计算机无法卸载软件,电脑软件无法卸载怎么解决
  9. mysql 复制数据文件_mysql数据库搬家,可以直接复制数据库文件吗
  10. 网页认不出USBKEY