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
原创粉丝点击