链接
思路 :分两步处理。
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];
}
}
}
}
}