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

NYOJ128 前缀式计算(栈的运用)

时间:2014-12-21 23:39:49      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:nyoj   stl      

题目信息:

http://acm.nyist.net/JudgeOnline/problem.php?pid=128

+ 2 * + 3 4 5的值就是 37,详见输入输出。

输入
有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符之间都有一个空格。输入的两个操作数可能是小数,数据保证输入的数都是正数,并且都小于10,操作数数目不超过500。
以EOF为输入结束的标志。
输出
对每组数据,输出该前缀表达式的值。输出结果保留两位小数。
样例输入
+ 2 * + 3 4 5
+ 5.1 / 3 7
样例输出
37.00
5.53

题目分析:

用两个栈进行存下数字和操作,进行计算,我刚开始想的是,每当连续输入两个数就行进行计算,并将结果压入数字栈中,并且操作时,应该保证后出栈的数字在前,先出栈的在后,这样可以保证-、/的结果。。。。。哎,不知道为什么一直Wa,最后看看别人打代码,这题可以从后往前计算,遇到操作符进行计算即可。此题需要注意就是字符串到数字的转换。


AC代码:

#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
char str[1005];
stack<double> dt;
int start;

void vol(){
    int i=0,k=0;
    char a[15],b[15];
    for(;str[start]!=' ';start--){
        a[k++]=str[start];
    }
    start--;//去掉数字后面的空格
    a[k]='\0';
    //strrev();此函数不能用
    for(i=0;i<k/2;i++){
        char c=a[i];
        a[i]=a[k-1-i];;
        a[k-1-i]=c;
    }
    dt.push(atof(a));
}
double YunSuan(){
    double a,b;
    while(start!=-2){
        switch (str[start]){
            case '+':
                a=dt.top(); dt.pop();
                b=dt.top(); dt.pop();
                dt.push(b+a);start-=2;//去掉该字符和字符后面的空格
            break;
            case '-':
                a=dt.top(); dt.pop();
                b=dt.top(); dt.pop();
                dt.push(a-b);start-=2;
            break;
            case '*':
                a=dt.top(); dt.pop();
                b=dt.top(); dt.pop();
                dt.push(a*b);start-=2;
            break;
            case '/':
                a=dt.top(); dt.pop();
                b=dt.top(); dt.pop();
                dt.push(a/b);start-=2;
            break;
            default: vol();
        }
    }
    return dt.top();
}
int main()
{
    while(gets(str)){
        start=strlen(str)-1;
        printf("%.2lf\n",YunSuan());
    }
    return 0;
}

我的代码:

int main()
{
    string str;
    int i,k;
    double a,b;
    while(getline(cin,str)){
        stack<double> dt;
        stack<char> ct;
        i=-1; k=0;
        while(i!=str.size()){
            ++i;
            if(str[i] == ' ') ++i;
            if(str[i] >= '0' && str[i] <= '9'){
                string res; double temp;
                while(i != str.size() && str[i] != ' ')
                    res += str[i++];
                sscanf(res.c_str(), "%lf", &temp);
                //cout<<temp<<endl;
                dt.push(temp),++k;
                //++k;
            }
            if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'){
                ct.push(str[i++]);
                k=0;
            }
            if(k==2&&dt.size()>1){
                a=dt.top();
                dt.pop();
                b=dt.top();
                dt.pop();
                char c=ct.top();
                ct.pop();
                if(c=='+') dt.push(b+a);
                if(c=='-') dt.push(b-a);
                if(c=='*') dt.push(b*a);
                if(c=='/') dt.push(b/a);
                k=1;
            }
        }
        while(dt.size()>1&&ct.size()){//计算最后一个
            a=dt.top();
            dt.pop();
            b=dt.top();
            dt.pop();
            char c=ct.top();
            ct.pop();
            if(c=='+') dt.push(b+a);
            if(c=='-') dt.push(b-a);
            if(c=='*') dt.push(b*a);
            if(c=='/') dt.push(b/a);
        }
        int k=1;
        if(ct.size()&&ct.top()=='-') k=-1;
        printf("%.2lf\n",k*dt.top());
    }
	return 0;
}



NYOJ128 前缀式计算(栈的运用)

标签:nyoj   stl      

原文地址:http://blog.csdn.net/fool_ran/article/details/42065841

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