【stack 实现前缀、后缀、中缀表达式运算】



问题一:输入一个前缀表达式,每个运算符和数字之间都有一个空格,输入的数字全为正实数。


代码实现:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#define MAXN 600
using namespace std;
char str[MAXN];
void solve(char *s)
{
    stack<double> S;
    strrev(s);
    char num[MAXN];
    int t = 0;
    bool flag = false;
    int len = strlen(s);
    for(int i = 0; i <= len; i++)
    {
        if(s[i] >= '0' && s[i] <= '9' || s[i] == '.')
        {
            flag = true;
            num[t++] = s[i];
        }
        else if(s[i] == ' ' || s[i] == '\0')
        {
            if(flag)
            {
                num[t] = '\0';
                strrev(num);//从后向前扫 碰到数字用字符串记录后,需要反转
                S.push(atof(num));
                t = 0;
                flag = false;
            }
        }
        else
        {
            double a = S.top(); S.pop();
            double b = S.top(); S.pop();
            double c;
            switch(s[i])
            {
                case '+': c = a + b; break;
                case '-': c = a - b; break;
                case '*': c = a * b; break;
                case '/': c = a / b;
            }
            S.push(c);
        }
    }
    printf("%.2lf\n", S.top());
}
int main()
{
    while(gets(str)){
        solve(str);
    }
    return 0;
}



测试数据:


1
1.00
10.1234
10.12
+ 2 * + 3 4 5
37.00
+ 5.1 / 3 7
5.53



问题二:同问题一,输入一个后缀表达式,求结果。


代码实现:


#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <algorithm>
#define MAXN 600
using namespace std;
char str[MAXN];
void solve(char *s)
{
    stack<double> S;
    char num[MAXN];
    int t = 0;
    bool flag = false;
    int len = strlen(s);
    for(int i = 0; i <= len; i++)
    {
        if(s[i] >= '0' && s[i] <= '9' || s[i] == '.')
        {
            flag = true;
            num[t++] = s[i];
        }
        else if(s[i] == ' ' || s[i] == '\0')
        {
            if(flag)
            {
                num[t] = '\0';
                S.push(atof(num));
                t = 0;
                flag = false;
            }
        }
        else
        {
            double b = S.top(); S.pop();//两数位置和前缀不一样
            double a = S.top(); S.pop();
            double c;
            switch(s[i])
            {
                case '+': c = a + b; break;
                case '-': c = a - b; break;
                case '*': c = a * b; break;
                case '/': c = a / b;
            }
            S.push(c);
        }
    }
    printf("%.2lf\n", S.top());
}
int main()
{
    while(gets(str)){
        solve(str);
    }
    return 0;
}




测试数据:


1
1.00
10.1234
10.12
2 3 4 + 5 * +
37.00
5.1 3 7 / +
5.53



问题三:求解中缀表达式,要求同问题一。

暂时看这个吧   点我  抽空补上新代码     现在要写数据结构实验了 ╮(╯▽╰)╭ 

你可能感兴趣的:(【stack 实现前缀、后缀、中缀表达式运算】)