前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >九度OJ——1019简单计算器

九度OJ——1019简单计算器

作者头像
AI那点小事
发布2020-04-18 19:58:23
5100
发布2020-04-18 19:58:23
举报

题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输入: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。 输出: 对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。 样例输入: 1 + 2 4 + 2 * 5 - 7 / 11 0 样例输出: 3.00 13.36


AC代码:

#include <iostream>
#include <cstdio>
#include <stack>
#include <vector>
#include <cstdlib>
using namespace std;

string str;
vector<string> latter,mid;
stack<string> s;
stack<double> caculate;

//栈外优先级
int icp(char ch)
{
    int result = 0;
    if(ch == '#'){
        result = 0;
    }
    if(ch == '*'||ch == '/'){
        result = 4;
    }
    if(ch == '+'||ch == '-'){
        result = 2;
    }   
    return result;      
 } 

//栈内优先级
int isp(char ch)
{
    int result = 0;
    if(ch == '#'){
        result = 0;
    }
    if(ch == '*'||ch == '/'){
        result = 5;
    }
    if(ch == '+'||ch == '-'){
        result = 3;
    }   
    return result;      
 } 

//生成中缀表达式
void Median()
{
    for(int i = 0 ; i < str.length() ; i++){
        if(str[i] >= '0' && str[i] <= '9'){
            int j;
            for(j = i ; j < str.length() ; j++){
                if(str[j]>= '0' && str[j] <= '9'){
                    continue;
                }else{
                    break;
                }
            }
            mid.push_back(string(str,i,j-i));
            i = j-1;
        }else if(str[i] == ' '){
            continue;
        }else{
            mid.push_back(str.substr(i,1));
        }
    }
    mid.push_back(string(1,'#'));
}

//生成后缀表达式
void Latter()
{
    s.push(string(1,'#'));
    for(int i = 0 ; i < mid.size() ; i++){
        //是数字直接追加大后缀表达式 
        if(mid[i][0] >= '0' && mid[i][0] <= '9'){
            latter.push_back(mid[i]);
        }else{//是运算符
            //栈顶元素的优先级小于栈外元素的优先级,栈外元素入栈 
            string ch = s.top();
            if(isp(ch[0]) < icp(mid[i][0])){
                s.push(string(mid[i]));
            }else if(isp(ch[0]) > icp(mid[i][0])){
                //栈顶元素的优先级大于栈外元素的优先级,栈顶元素出栈到后缀表达式 
                latter.push_back(ch);
                s.pop();
                i--;
            }else{//栈顶元素的优先级到等于栈外元素的优先级 ,说明遍历到"#",结束 
                s.pop();
            }
        }
    } 
 } 

int main()
{
    while(1){
        mid.clear();
        latter.clear();
        str.clear();
        getline(cin,str);
        if(str[0] == '0'){
            break;
        }
        Median();
        Latter();
        for(int i = 0 ; i < latter.size() ; i++){
            if(latter[i][0] >= '0' && latter[i][0] <= '9'){
                double num = atof(latter[i].c_str());
                caculate.push(num);
            }else{
                double b = caculate.top();
                caculate.pop();
                double a = caculate.top();
                caculate.pop();
                double c;
                switch(latter[i][0]){
                    case '+': c = a + b;break;
                    case '-': c = a - b;break;
                    case '*': c = a * b;break;
                    case '/': c = a / b;break;
                }
                caculate.push(c);
            }
        }
        double result = caculate.top();
        caculate.pop();
        printf("%.2f\n",result);
    }

    return 0; 
} 

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档