九度OJ 1019

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

解析:几乎所有数据结构的书上在讲栈的应用的时候,肯定会讲这个简单计算器的实现。没错,这个表达式的计算充分考察了我们对于栈的理解。
因为之前做过一个类似的表达式的计算,所以这个题目做起来还是一次性A的。
首先建立两个栈,一个字符栈,用来保存运算符;另一个数字栈,用来保存数字。注意这里保存的数字应该是 double型的,因为结果输出要保留两位小数。还有一点要注意的是,输入的数字可能是多位的,所以这里只能一位一位扫描,遇到空格则跳过,不能直接i=i+2。然后遇到后面还是数字的情况就将前面的值乘以10加上当前的数字即可。
从左往右扫描,遇到数字放入数字栈,遇到字符放入字符栈。如果当前字符的优先级比栈顶符号的优先级要大,则直接入栈。否则从数字栈弹出两个数字,从字符栈弹出一个运算符,进行运算后,将结果压入数字栈。之后还要进行字符优先级的判断,直到当前字符的优先级大于栈顶符号的优先级。最后把当前字符压入字符栈内。
全部扫描之后,还要进行最后栈内的运算。如果字符栈不空,不断的弹出两个数字栈内的元素和栈顶运算符,运算之后结果入栈。最后输出数字栈内的唯一的一个元素,就是要求的结果。注意输出的结果格式就行。
#include <iostream>
#include <stack>
#include <iomanip>
using namespace std;

int get_priority(char c){
    if(c == '+' || c == '-')
        return 1;
    if(c == '*' || c == '/')
        return 2;
    else
        return 0;
}

int main(){
    stack<char>char_s;
    stack<double>num_s;
    string str;
    while(getline(cin,str)){
        if(str == "0")
            break;
        for(int i=0;i<str.length();i++){
            if(str[i] == ' ')
                continue;
            int num = 0;
            int j = i;
            if(str[j]>='0' && str[j]<='9'){
                while(str[j]>='0' && str[j]<='9'){
                    num = num*10 + (str[j] - '0');
                    j++;
                }
                num_s.push(num);
                i = j-1;
            }
            else{
                if(char_s.empty()){
                    char_s.push(str[i]);
                    continue;
                }
                if(get_priority(str[i]) > get_priority(char_s.top()))
                   char_s.push(str[i]);
                else{
                    do{
                        double result;
                        double a = num_s.top();
                        num_s.pop();
                        double b = num_s.top();
                        num_s.pop();
                        char c = char_s.top();
                        char_s.pop();
                        if(c == '+')    result = b + a;
                        if(c == '-')    result = b - a;
                        if(c == '*')    result = b * a;
                        if(c == '/')    result = b / a;
                        num_s.push(result);
                        if(char_s.empty())
                            break;
                    }while(get_priority(str[i]) <= get_priority(char_s.top()));
                    char_s.push(str[i]);
                }
            }
        }
        while(!char_s.empty()){
            double result;
            double a = num_s.top();
            num_s.pop();
            double b = num_s.top();
            num_s.pop();
            char c = char_s.top();
            char_s.pop();
            if(c == '+')    result = b + a;
            if(c == '-')    result = b - a;
            if(c == '*')    result = b * a;
            if(c == '/')    result = b / a;
            num_s.push(result);
        }
        cout<<fixed<<setprecision(2)<<num_s.top()<<endl;
        //printf("%.2f",num_s.top());
        num_s.pop();
    }
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

九度OJ的使用

1.网址:ac.jobdu.com 2.如果以前是王道论坛的用户,直接输入那个账号和密码就行。   如果不是的话,可以在首页新注册一个。 3.做题:在首页上方第二栏“在线练习”中点击“题...
  • sunwl_csdn
  • sunwl_csdn
  • 2016年07月13日 22:27
  • 1040

九度OJ 1435 迷瘴

题目地址:http://ac.jobdu.com/problem.php?pid=1435 题目描述: 通过悬崖的yifenfei,又面临着幽谷的考验—— 幽谷周围瘴气弥漫,静的可怕,...
  • JDPlus
  • JDPlus
  • 2014年02月06日 16:13
  • 2749

九度OJ 题目1019:简单计算器

题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。 输入:     测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,...
  • qwerty_bibabo
  • qwerty_bibabo
  • 2016年02月02日 21:41
  • 848

九度OJ 1185 特殊排序

题目链接:http://ac.jobdu.com/problem.php?pid=1185 题目分析: 简单的数字排序。 要注意输出的格式,我就因为格式的问题出现了一次Presentat...
  • wh921021
  • wh921021
  • 2013年05月17日 17:43
  • 1436

【学习笔记】〖九度OJ〗题目1161:Repeater

本题要求按模板将原图扩展,扩展方法是,如果在模板中当前位置(i, j)不为空格,那么再下一层的图形中,相对位置(i,j)处(即按比例扩大)为本层的完整图形。...
  • j597960549
  • j597960549
  • 2014年03月05日 18:06
  • 1287

九度OJ各种题型 分类

模拟类型(这类题常考,看似不难,但是对于初学者来说,用代码完整地写出题意描述中的意思还是需要多加练习):    1000 1001 1020 1031 1036 1038(这题请认真读题) 1013...
  • lyj2014211626
  • lyj2014211626
  • 2017年05月09日 16:20
  • 372

【九度OJ】1019【栈】

编写一个简易计算器,简易体现在无小数,无负数,
  • ALiTuTu
  • ALiTuTu
  • 2014年08月11日 14:04
  • 364

九度OJ 1008 最短路径问题

题目描述: 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 输入: 输入n,m,点的...
  • Jaster_wisdom
  • Jaster_wisdom
  • 2016年06月27日 21:58
  • 772

九度1161——Repeater

原题http://ac.jobdu.com/problem.php?pid=1161 题目描述: Harmony is indispensible in our daily life and no...
  • qq_24421591
  • qq_24421591
  • 2016年03月31日 12:11
  • 958

九度OJ 1108 堆栈的使用

题目描述:     堆栈是一种基本的数据结构。堆栈具有两种基本操作方式,push 和 pop。Push一个值会将其压入栈顶,而 pop 则会将栈顶的值弹出。现在我们就来验证一下堆栈的使用。 ...
  • Jaster_wisdom
  • Jaster_wisdom
  • 2016年08月07日 15:30
  • 668
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:九度OJ 1019
举报原因:
原因补充:

(最多只允许输入30个字)