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

HDU1237--简单计算器(栈的应用)

时间:2017-01-17 21:42:11      阅读:353      评论:0      收藏:0      [点我收藏+]

标签:ott   复试上机   lin   ini   print   border   blog   应用   个数   

Problem Description

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

Input

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

Output

            对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

Sample Input

1 + 2
4 + 2 * 5 - 7 / 11
0

Sample Output

3.00
13.36

Source

浙大计算机研究生复试上机考试-2006年

Recommend

JGShining

思路:

因为乘除的优先级要高于加减的优先级,所以要先进行乘除的计算,每一个乘除计算的两个元素是前一个与后一个,其中,前一个数可能原始数据,也可能

是进行了乘除运算之后的结果(第一遍遍历我们只处理乘除)

可以用栈来模拟,没进行一次乘除运算就将结果取代栈顶元素

第二遍遍历的时候,处理加减运算

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=210;
int num[MAXN];
char f[MAXN];
double s[MAXN];
char sg[MAXN];
int main()
{
    string str;
    while(getline(cin,str)&&str!="0"){
        stringstream stm(str);
        int i=1,j=0;
        int sum_num=0;
        stm>>num[0];
        while(stm>>f[j]>>num[i]){
            j++;
            i++;
            sum_num++;
        }
        int cou=0,cou2=0;
        double tmp=0;
        s[cou++]=num[0];
        for(i=1,j=0;j<sum_num;i++,j++){
            switch(f[j]){
                case +:s[cou++]=num[i];sg[cou2++]=f[j];break;
                case -:s[cou++]=num[i];sg[cou2++]=f[j];break;
                case *:tmp=s[--cou]*num[i];s[cou++]=tmp;break;
                case /:tmp=s[--cou]/(num[i]*1.0);s[cou++]=tmp;break;
            }
        }
        double res=s[0];
        for(i=1,j=0;j<cou2;j++,i++){
            switch(sg[j]){
                case +:res+=s[i];break;
                case -:res-=s[i];break;
            }
        }
        printf("%.2lf\n",res);
        //cout<<res<<endl;
    }
}

HDU1237--简单计算器(栈的应用)

标签:ott   复试上机   lin   ini   print   border   blog   应用   个数   

原文地址:http://www.cnblogs.com/liuzhanshan/p/6294501.html

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