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

Posted Pic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1237--简单计算器(栈的应用)相关的知识,希望对你有一定的参考价值。

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--简单计算器(栈的应用)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1237 简单计算器 —— stackstringstream 的使用

HDU 1237 简单计算器

C - 简单计算器 (HDU - 1237)

Hdu 1237简单计算器

HDU 1237 简单计算器(后缀式+栈)

hdu 1237 简单计算器(栈处理)