浙江财经大学
信息管理与工程学院

HDU 1237 简单计算器(栈、串的应用)

本文由 Ocrosoft 于 2016-07-02 14:44:43 发表

简单计算器

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 17693    Accepted Submission(s): 6206

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

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

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

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

Sample Output
	
3.00 13.36
 

Solution

参考http://www.ocrosoft.com/?p=29,只是这里循环读入而且有空格。数据有0 1这种,所以不能只判断第一位是0就结束读入。

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <cmath>
#include <algorithm>
#include <list>
#include <stack>
#include <string>
#include <vector>
#include <cstring>
#include <cctype>
#define ms(a) memset(a,0,sizeof(a))
using namespace std;
stack<char> sop;
char s[1200],postexp[1200];
double res;
void Trans()
{
    while(!sop.empty())
        sop.pop();
    int i=0,j=0;
    char ch;
    while(s[i])
    {
        ch=s[i];
        if(ch=='(')
            sop.push(ch);
        else if(ch==')')
        {
            while(!sop.empty()&&sop.top()!='(')
            {
                postexp[j++]=sop.top();
                sop.pop();
            }
            sop.pop();
        }
        else if(ch=='+'||ch=='-')
        {
            while(!sop.empty()&&sop.top()!='(')
            {
                postexp[j++]=sop.top();
                sop.pop();
            }
            sop.push(ch);
        }
        else if(ch=='*'||ch=='/')
        {
            while(!sop.empty()&&sop.top()!='('&&(sop.top()=='*'||sop.top()=='/'))
            {
                postexp[j++]=sop.top();
                sop.pop();
            }
            sop.push(ch);
        }
        else if(ch==' ')
        {
            i++;
            continue;
        }
        else
        {
            while(ch>='0'&&ch<='9')
            {
                postexp[j++]=ch;
                i++;
                if(s[i])ch=s[i];
                else break;
            }
            i--;
            postexp[j++]='#';
        }
        i++;
    }
    while(!sop.empty())
    {
        postexp[j++]=sop.top();
        sop.pop();
    }
    postexp[j++]='\0';
}
bool solve()
{
    stack<double> st;
    double a,b,c,d;
    int i=0;
    char ch;
    int len=strlen(postexp);
    while(i<len)
    {
        ch=postexp[i];
        switch(ch)
        {
        case '+':
            a=st.top(),st.pop();
            b=st.top(),st.pop();
            c=b+a;
            st.push(c);
            break;
        case '-':
            a=st.top(),st.pop();
            b=st.top(),st.pop();
            c=b-a;
            st.push(c);
            break;
        case '*':
            a=st.top();
            st.pop();
            b=st.top();
            st.pop();
            c=b*a;
            st.push(c);
            break;
        case '/':
            a=st.top(),st.pop();
            b=st.top(),st.pop();
            if(a!=0)
            {
                c=b/a;
                st.push(c);
            }
            else return false;
            break;
        default:
            d=0;
            while(ch>='0'&&ch<='9')
            {
                d=10*d+(ch-'0');
                i++;
                ch=postexp[i];
            }
            st.push(d);
        }
        i++;
    }
    res=st.top();
    return true;
}
int main()
{
    while(gets(s)!=NULL)
    {
        if(s[0]=='0'&&strlen(s)==1)break;
        Trans();
        if(solve())
            printf("%.2lf\n",res);
        else
            cout<<"Error!\n";
    }
    return 0;
}

 

欢迎转载,请保留出处与链接。Ocrosoft » HDU 1237 简单计算器(栈、串的应用)

点赞 (0)or拍砖 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址