zzuli 1923: 表达式求值
来源:互联网 发布:linux 2台机器互信 编辑:程序博客网 时间:2024/06/14 19:15
链接
思路 :分两步处理。
1. 对原字符处理 , 去掉讲 Smax(x,y)转化成 ((x) , (y))。int Smax_func(int num) 函数进行这个操作。
2. 用逆波兰表达式 , 先将处理后的中缀表达式转化成后缀表达式 , 再一套带走。(注意我认为 “,” 字符的优先级和 “*”“/ ”一样)。
#include <iostream>#include <algorithm>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <stack>using namespace std;const int N = 1100;typedef struct{ char arr[N]; bool book[N]; int top;}note;note strk_int,strk_str;inline int Smax_func(int num);inline void str_zhuan(char *str);inline void init(char *str); //将中缀表达式转化为后缀表达式int main(){ long long sum; int flag = 0 , t; char str[N]; scanf("%d",&t); getchar(); while (t--) { scanf(" %s",str); if(strlen(str) == 0) continue; stack<int> strk; str_zhuan(str); init(str); while (strk_str.top != 0) strk_int.arr[++strk_int.top] = strk_str.arr[strk_str.top--]; for(int i=1; i<strk_int.top;) //对后缀表达式求值 { sum = flag = 0; while (strk_int.arr[i]>='0' && strk_int.arr[i]<='9') { if(flag == 1 &&strk_int.book[i] == 0) break; flag = 1; sum = sum*10 + strk_int.arr[i]-'0'; i++; } if(flag) strk.push(sum); else i++; if((strk_int.arr[i]<'0' || strk_int.arr[i]>'9')) { int num1 = strk.top(); strk.pop(); int num2 = strk.top(); strk.pop(); int num3; switch (strk_int.arr[i]) { case '+': num3 = num2 + num1; break; case '-': num3 = num2 - num1; break; case '*': num3 = num2 * num1; break; case '/': num3 = num2 / num1; break; case ',': num3 = max(Smax_func(num2),Smax_func(num1)); break; default: break; } strk.push(num3); } } int ans = strk.top(); //strk.pop(); printf("%d\n",ans); } return 0;}inline int Smax_func(int num){ int sum = 0; while(num > 0) { sum += num%10; num /= 10; } return sum;}inline void str_zhuan(char *str){ int flag = 0 , i , j; char str_two[N]; int len = strlen(str); for(i=0 , j = 0; i<len;) { if(str[i]=='S' || str[i]=='m' || str[i]=='a') { i++; continue; } if(str[i] == 'x') { flag += 1; i++; str_two[j++] = '('; } else if(str[i] == ',') { str_two[j++] = ')'; str_two[j++] = str[i++]; str_two[j++] = '('; } else if(str[i] == ')') { if(flag) { str_two[j++] = ')'; str_two[j++] = str[i++]; flag -= 1; } else str_two[j++] = str[i++]; } else str_two[j++] = str[i++]; } str_two[j] = '\0'; for(i=0; i<=j; i++) str[i] = str_two[i];}inline void init(char *str){ bool is = false; int len = strlen(str),flag = 0; memset(&strk_int,0,sizeof(strk_int)); memset(&strk_str,0,sizeof(strk_str)); for(int i=0; i<len; i++) { if(str[i] == ' ') { is = false; continue; } else if(str[i] >='0' && str[i]<='9') { strk_int.arr[++strk_int.top] = str[i]; if(is == true) { strk_int.book[strk_int.top] = 1; //每个数的第一位,其对应下标的book数组的值是false , 以此作为正确求出每个数的依据 } is = true; } else { is = false; if(str[i] == '(') strk_str.arr[++strk_str.top] = '(' , flag++; else if(str[i] == ')') { while (strk_str.arr[strk_str.top] != '(') { strk_int.arr[++strk_int.top] = strk_str.arr[strk_str.top--]; } strk_str.top-- , flag--; } else { if(str[i]=='+' || str[i]=='-') //遇 +,- 将栈中元素清除 { while (strk_str.top != 0 && strk_str.arr[strk_str.top]!='(') strk_int.arr[++strk_int.top] = strk_str.arr[strk_str.top--]; strk_str.arr[++strk_str.top] = str[i]; } else // * / 将遇到+ , - ( , )之前的 * / 清除 { while (strk_str.top!=0 && (strk_str.arr[strk_str.top]=='*' || strk_str.arr[strk_str.top]=='/')) { strk_int.arr[++strk_int.top] = strk_str.arr[strk_str.top--]; } strk_str.arr[++strk_str.top] = str[i]; } } } }}
0 0
- zzuli 1923: 表达式求值
- 【zzuli 1923 表达式求值】+ 字符串 + 栈
- zzuli 1530 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 深入理解继承
- Spring之利用autowire属性进行自动装配
- 【技能库】--postman json 请求(192)
- java中的 jdbc 设置连接池 增删改查方法
- Angular2 + Webpack项目搭建Demo
- zzuli 1923: 表达式求值
- FizzBuzz
- #eclipse导入java工程中文乱码解决方法
- C/C++重难点总结系列(五)
- Centos7 x86_64 iso 下载地址列表
- C++函数的编译
- GDOI&&GDSOI总结
- [Leetcode] 130. Surrounded Regions 解题报告
- mysql优化——主从同步读写分离mysqlproxy