问题描述:

输入一个表达式(用字符串表示),求这个表达式的值。

保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。

输入描述:

输入一个算术表达式

输出描述:

得到计算结果

示例:

输入: 3+2*{1+2*[-4/(8-6)+7]}

输出:25

思想:

利用两个栈(数组)来记录表达式,栈1为int型,用来记录数字,栈2为char型,用来记录符号。

对每一个符号应设定优先级,规定:{、[、(   >   * 、/   >  + 、-   >  }、]、)

左括号的优先级最高,其次是乘除号,加减号,最后是右括号。

压栈规则:

遇到数字时压入栈1,(由于输入形式为字符串,且数字有可能有好几位,需要利用循环来记算数字大小)。

遇到符号时:

如果是" - ",需要判断是负号还是减号:如果" - "是负号的话,那么它前面应该没有数字,即判断前一个字符是否是左括号,或者当前是否是第一个字符,是的话就是负号,那么把下一个数字当作负数记录进栈。

如果遇到了右括号,那么应该开始进行计算,直到栈2匹配到左括号为止,且右括号不进栈。

遇到正常计算符号:

首先比较当前符号与s2栈顶符号优先级,如果当前符号的优先级更高,需要压栈(包括左括号)。

如果当前符号优先级 <= s2栈顶符号的优先级,那么将s1栈顶两个数字弹出,将s2栈顶符号弹出,进行计算,计算后的结果压入s1,并继续比较当前符号与栈顶符号的优先级(此处我将i - 1,继续进行for循环)

注意:s1栈顶数字弹出时应该注意计算时的前后顺序,例如减法和除法。

ps.代码有些繁琐

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int priority(char s)   //优先级的定义
{//规则:右括号 < + - < * / < 左括号int s_a = 0;if(s == '(' || s == '[' || s == '{')s_a = 3;else if(s == '*' || s == '/')s_a = 2;else if(s == '+' || s == '-')s_a = 1;return s_a;
}int fun(int a, int b, char op)
{if(op == '+')return a + b;if(op == '-')return a - b;if(op == '*')return a * b;if(op == '/')return a / b;return 0;
}int main()
{char str[1000];scanf("%s",str);int len = strlen(str);int s1[1000] = { 0 }; //两个栈,一个栈用来记录数字,一个栈用来记符号char s2[1000];int top1 = 0;int top2 = 0;for(int i = 0; i < len; i++){int n = 0;   //用来循环记录数字if(str[i] >= '0' && str[i] <= '9'){while(str[i] >= '0' && str[i] <= '9'){n = 10 * n + str[i] - '0';i++;}i--;    //注意i此时指向的是负号,所以需要提前-1才能继续循环s1[top1] = n;  //把数字压栈top1++;  //栈顶指针指向的一直是栈顶+1}else if(str[i] == '-' && (str[i - 1] == '('||str[i - 1] == '['||str[i - 1] == '{'||i == 0)){//如果遇到- 应该判断是负号还是减号,如果-前没有数字则是负号i++;s1[top1] = str[i]- '0';s1[top1] = 0 - s1[top1];top1++;}else{if(str[i] == '}' || str[i] == ']' || str[i] == ')')  //如果遇到右括号应该一直计算到栈顶是左括号{while(s2[top2 - 1] != '{' && s2[top2 - 1] != '[' && s2[top2 - 1] != '('){int b = s1[top1 - 1];int a = s1[top1 - 2];//s1栈顶两个数字出栈,注意顺序char op = s2[top2 - 1];top2--; //s2栈顶符号出栈s1[top1 - 2] = fun(a, b, op);top1--;}top2--;continue;}int p1 = priority(str[i]);int p2 = priority(s2[top2 - 1]);if(top2 == 0 || p1 > p2 || s2[top2 - 1] == '{' || s2[top2 - 1] == '[' || s2[top2 - 1] == '(' ) //栈是空的,或者遇到了更高级的运算符,直接进栈,左括号不能忽略{s2[top2] = str[i];top2++;}else if(p1 <= p2)  //如果栈顶是左括号忽略{int b = s1[top1 - 1];int a = s1[top1 - 2];//s1栈顶两个数字出栈char op = s2[top2 - 1];top2--; //s2栈顶符号出栈s1[top1 - 2] = fun(a, b, op);top1--;i--;}}}//进栈完毕了top1--;top2--;while(top1>0)  //栈1不空的时候{int b = s1[top1];int a = s1[top1 - 1];char op = s2[top2];s1[top1 - 1] = fun(a, b, op);top2--;top1--;}printf("%d", s1[0]); return 0;
}

[华为OJ]四则运算(C语言)相关推荐

  1. oj上c语言编译错误,名字的漂亮度(华为OJ)C语言版本(提示格式错误,但是编译器没有报错,知道的网友提个意见)...

    描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的"漂亮度"是其所有字母"漂亮度"的总和.每个字母都有一个"漂亮度",范围在1到 ...

  2. 华为oj题目c语言,华为OJ机试题目——24点游戏算法

    对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)o ...

  3. 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...

  4. C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...

    华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...

  5. c语言最大值和最小值1157,基于NBU OJ的C语言在线实验及习题汇编(计算机科学与技术21世纪高等学校规划教材)...

    导语 内容提要 陈叶芳主编的<基于NBU OJ的C语言在线实验及习题汇编>是为"C语言程序设计"课程编写的实验指导用书.全书以宁波大学程序设计在线评判系统(NBU OJ ...

  6. go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...

    Gopher China作为国内最权威和最实力干货的Go大会,致力于为广大的Gopher提供一线分享交流机会,也为众多一线互联网公司大咖深入探讨Go语言的应用发展提供契机. 在近日于上海召开的第六届G ...

  7. 【华为OJ】【042-矩阵乘法】

    [华为OJ][算法总篇章] [华为OJ][042-矩阵乘法] [工程下载] 题目描述 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 这个矩阵的每个元 ...

  8. 【华为OJ】【067-求最小公倍数】

    [华为OJ][算法总篇章] [华为OJ][067-求最小公倍数] [工程下载] 题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数. ...

  9. 华为面试题库c语言,华为校园招聘c语言面试题集.doc

    华为校园招聘c语言面试题集.doc 华为C语言面试题集C语言面试题华为C语言面试题深圳华为面试C语言面试题1.局部变量能否和全局变量重名答能,局部会屏蔽全局.要用全局变量,需要使用"&quo ...

最新文章

  1. php中空心字体怎么打,php打印一个边长为N的实心和空心菱型的方法
  2. UVA 11259 Coin Changing Again
  3. Ribbon 负载均衡调用04——ribbon 负载均衡算法||手写轮询算法(原理+JUC)CAS+自旋锁
  4. 《研磨设计模式》chap13 命令模式
  5. P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)
  6. MyBatis 的执行流程,学废了!
  7. 关于ssm框架的整合(二) 2021.05.10
  8. 20200507:力扣151周赛下
  9. selenium报错TypeError: 'FirefoxWebElement' object is not iterable
  10. 电商App如何让用户直接打开商品详情页
  11. vue 项目安装axios报错
  12. 【Linux】系统移植篇四--uboot移植
  13. [转]Windows10 中文版 英文语言包安装失败解决
  14. 一次Rpc调用报错排查
  15. Tkinter GUI设计中文文档
  16. 文件不小心删除了怎么恢复?实用的两个小妙招
  17. 【Insights直播】华为帐号服务,打造全场景安全帐号体系
  18. it is forbidden to set both [discovery.seed_hosts] and [discovery.zen.ping.unicast.hosts]
  19. 计算机设计网页基础知识,网页设计的基础知识
  20. 全网最详细,MySQL数据库知识总结,你要的我都有......

热门文章

  1. 数据分析实战项目-用户行为分析(Python)
  2. 调用matlab dll报错,c#调用MATLAB的dll时出错
  3. Android NFC开发实战详解PDF
  4. QQ跳转加好友、加QQ群链接代码生成制作
  5. Win2000、NT 环境真正 RPL 无盘 WIN98 安装指南(转)
  6. 用于钢结构桥梁局部计算的ansa建模教程1
  7. 2CoreIDRAW 软件的实际应用
  8. Linux运维之道之ENGINEER1.0(系统安全,高级连接,防火墙策略)
  9. 新闻管理系统-javaWeb -大作业-更新版(之前的存在问题)
  10. 网络信息安全——访问控制