码迷,mamicode.com
首页 > 其他好文 > 详细

求前缀表达式的值(25)

时间:2015-06-05 17:27:17      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

这道题用到了栈,所以就用C++来做咯

当然C也可以做,不过就显得麻烦了。

/*--------------------------------------*/

我们把这道题分成几个部分

1. 输入部分 怎么判断输入的是一个运算符还是一个数?

2. 计算部分 前缀表达式如何计算?在什么情况下我们可以说前缀表达式有错,而报出一个"ERROR"?

 

首先创建了一个表达式栈expression用来存表达式的内容

第一部分的思路是这样的,每次从输入流获取一个字符串string

1.如果string是加减乘除,就把运算符push进表达式栈

2.如果string不是加减乘除,那string一定是数,就把str2double(string)的值push进站,str2double是我自己写的一个把字符串转换成double类型数的函数

经过了以上操作,表达式栈expression里就装好了表达式的内容

 

第二部分,开始计算咯。首先创建一个运算数栈num

1.如果expression.top是数,则把此数加入num,再expression.pop

2.如果expression.top是加减乘除,则取出num栈顶的两个元素,进行运算,再把运算结果加入num栈

什么时候应该报错呢?

1.  被除数是0时

2. expression.top是加减乘除,但是num栈里的元素少于两个,说明少了运算数,就像中缀表达式的(5+)*3一样,无法进行运算时

3. expression已经空了,可是num里的元素比两个还多,说明少了运算符,就像中缀表达式的(5 3)*3一样,无法进行运算时

 

最后,贴上代码

技术分享
#include <iostream>
#include <cstdio>
#include <stack>
#include <string>
using namespace std;

typedef struct{
    char operation;
    double value;
}expr;

double str2double(string get);
void ERROR();

int main()
{
    stack<expr> expression;
    string get;
    do{
        cin >> get;
        if (get == "+" || get == "-" || get == "*" || get == "/"){
            expression.push({ get.at(0), 0.0 });
        }
        else{
            expression.push({ \0, str2double(get) });
        }
    } while (getchar() != \n);

    stack<double> num;
    while (expression.empty() != true){
        if (expression.top().operation == \0){
            num.push(expression.top().value);
        }
        else{
            if (num.size() < 2){
                ERROR();
                return 0;
            }
            double a, b, c;
            b = num.top();
            num.pop();
            a = num.top();
            num.pop();
            if (expression.top().operation == / && a == 0){
                ERROR();
                return 0;
            }
            switch (expression.top().operation)
            {
            case+:c = b + a; break;
            case-:c = b - a; break;
            case*:c = b*a; break;
            case/:c = b / a; break;
            }
            num.push(c);
        }
        expression.pop();
    }
    if (num.size() >= 2){
        ERROR();
        return 0;
    }
    else{
        printf("%.1lf", num.top());
    }
}
double str2double(string get)
{
    auto begin = get.begin(), end = get.end();

    //符号处理
    bool negative = false;
    if (*begin == -){
        negative = true;
        begin++;
    }
    else if (*begin == +){
        begin++;
    }

    //绝对值计算
    double ret = 0;
    bool dot = false;
    double i = 10.0;
    while (begin != end){
        //逗号检测
        if (*begin == .){
            dot = true;
            begin++;
            continue;
        }
        //逗号前
        if (dot == false){
            ret *= 10;
            ret += *begin - 0;
            begin++;
        }
        //逗号后
        else{
            ret += ((*begin) - 0) / i;
            i *= 10;
            begin++;
        }
    }

    //符号处理
    if (negative == true && ret != 0){
        ret = -ret;
    }

    return ret;
}
void ERROR()
{
    cout << "ERROR";
}
View Code

 

求前缀表达式的值(25)

标签:

原文地址:http://www.cnblogs.com/zhouyiji/p/4554923.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!