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

题目信息:

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;
}
时间: 2024-12-08 23:26:56

NYOJ128 前缀式计算(栈的运用)的相关文章

NYOJ128 前缀式计算 【栈】

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描写叙述 先说明一下什么是中缀式: 如2+(3+4)*5这样的我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比方: + 2 * + 3 4 5的值就是 37 输入 有多组測试数

NYOJ128前缀式计算

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每

NYOJ 128 前缀式计算

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每

前缀式计算(前缀表达式)

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每

前缀式计算

前缀式计算 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每组测试数据占一行,任意两个操作符之间,任意两个操作数之间,操作数与操作符

南阳oj 前缀式计算 题目218

 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<stack> #define N 1000 using namespace std; char s[N],b[3]; stack<double>num; stack<char>st; int main() { while(gets(s)) { int k=strlen(s); double a1,a2

NYOJ--128--前缀式计算(表达式求值)

前缀式计算 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括号就是:(2+((3+4)*5)) 然后把运算符写到括号前面就是+(2 *( +(3 4) 5) ) 把括号去掉就是:+ 2 * + 3 4 5 最后这个式子就是该表达式的前缀表示. 给你一个前缀表达式,请你计算出该前缀式的值. 比如: + 2 * + 3 4 5的值就是 37 输入 有多组测试数据,每

数式计算(递归解法)

1 /** 2 *注:1.有一个bug(以及未知什么bug) 我已知的是: ([email protected])(ps:@为运算符),这种带括号的表达式不能单独的出现,否则异常退出,,但是只要([email protected])@n 3 4 带括号的表达式出现任意+,-,*,/的运算都能进行正常运算(前面 [email protected]([email protected])也不可以)...不知道为什么()表达式后面没有操作时会异常退出. 5 *不知道如何解决.希望感兴趣的人帮帮忙! 6

NYOJ467 中缀式变后缀式 【栈】

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更"习惯于"后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式. 输入 第一行输入一个整数n,共有n组测试数据(n<10). 每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以"="结束.这个