[华为OJ]四则运算(C语言)
问题描述:
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘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语言)相关推荐
- oj上c语言编译错误,名字的漂亮度(华为OJ)C语言版本(提示格式错误,但是编译器没有报错,知道的网友提个意见)...
描述 给出一个名字,该名字有26个字符串组成,定义这个字符串的"漂亮度"是其所有字母"漂亮度"的总和.每个字母都有一个"漂亮度",范围在1到 ...
- 华为oj题目c语言,华为OJ机试题目——24点游戏算法
对于这种题用程序实现只能是穷举的思想,而做法各异,如下代码是利用符号的不断变化,利用4个数计算值,默认是4个数字a,b,c,d是按顺序计算的,即默认是加了括号的,即(((a op1 b)op2 c)o ...
- 循环相乘取整法C语言,华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
- C语言无符号双字节乘法,华为OJ机试标题:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘) 题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出 ...
- c语言最大值和最小值1157,基于NBU OJ的C语言在线实验及习题汇编(计算机科学与技术21世纪高等学校规划教材)...
导语 内容提要 陈叶芳主编的<基于NBU OJ的C语言在线实验及习题汇编>是为"C语言程序设计"课程编写的实验指导用书.全书以宁波大学程序设计在线评判系统(NBU OJ ...
- go gorm 密码隐藏_掀开华为云的Go语言编程底座!有深度、有点难、需细品(上)...
Gopher China作为国内最权威和最实力干货的Go大会,致力于为广大的Gopher提供一线分享交流机会,也为众多一线互联网公司大咖深入探讨Go语言的应用发展提供契机. 在近日于上海召开的第六届G ...
- 【华为OJ】【042-矩阵乘法】
[华为OJ][算法总篇章] [华为OJ][042-矩阵乘法] [工程下载] 题目描述 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 这个矩阵的每个元 ...
- 【华为OJ】【067-求最小公倍数】
[华为OJ][算法总篇章] [华为OJ][067-求最小公倍数] [工程下载] 题目描述 正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数. ...
- 华为面试题库c语言,华为校园招聘c语言面试题集.doc
华为校园招聘c语言面试题集.doc 华为C语言面试题集C语言面试题华为C语言面试题深圳华为面试C语言面试题1.局部变量能否和全局变量重名答能,局部会屏蔽全局.要用全局变量,需要使用"&quo ...
最新文章
- php中空心字体怎么打,php打印一个边长为N的实心和空心菱型的方法
- UVA 11259 Coin Changing Again
- Ribbon 负载均衡调用04——ribbon 负载均衡算法||手写轮询算法(原理+JUC)CAS+自旋锁
- 《研磨设计模式》chap13 命令模式
- P1457 城堡 The Castle 位运算+BFS+思维(难题,好题)
- MyBatis 的执行流程,学废了!
- 关于ssm框架的整合(二) 2021.05.10
- 20200507:力扣151周赛下
- selenium报错TypeError: 'FirefoxWebElement' object is not iterable
- 电商App如何让用户直接打开商品详情页
- vue 项目安装axios报错
- 【Linux】系统移植篇四--uboot移植
- [转]Windows10 中文版 英文语言包安装失败解决
- 一次Rpc调用报错排查
- Tkinter GUI设计中文文档
- 文件不小心删除了怎么恢复?实用的两个小妙招
- 【Insights直播】华为帐号服务,打造全场景安全帐号体系
- it is forbidden to set both [discovery.seed_hosts] and [discovery.zen.ping.unicast.hosts]
- 计算机设计网页基础知识,网页设计的基础知识
- 全网最详细,MySQL数据库知识总结,你要的我都有......