• 3-07. 求前缀表达式的值(25) (ZJU_PAT数学)


    题目链接:http://pat.zju.edu.cn/contests/ds/3-07


    算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。前缀表达式指二元运算符位于两个运算数之前,比如2+3*(7-4)+8/4的前缀表达式是:+ + 2 * 3 - 7 4 / 8 4。请设计程序计算前缀表达式的结果值。

    输入格式说明:

    输入在一行内给出不超过30个字符的前缀表达式,仅仅包括+、-、*、以及运算数,不同对象(运算数、运算符号)之间以空格分隔。

    输出格式说明:

    输出前缀表达式的运算结果,精确到小数点后1位,或错误信息“ERROR”。

    例子输入与输出:

    序号 输入 输出
    1
    + + 2 * 3 - 7 4 / 8 4
    
    13.0
    
    2
    / -25 + * - 2 3 4 / 8 4
    
    12.5
    
    3
    / 5 + * - 2 3 4 / 8 2
    
    ERROR
    
    4
    +10.23
    
    10.2


    代码例如以下:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <stack>
    using namespace std;
    char s[47];
    stack<double>ss;
    
    int is_op(char c)
    {
    	if(c=='+' || c=='-' || c=='*' || c=='/')
    		return 1;
    	return 0;
    }
    int main()
    {
    	while(gets(s))
    	{
    		while(!ss.empty())//清空
    		{
    			ss.pop();
    		}
    		int len = strlen(s);
    		int cc = 1;
    		double tsum = 0;
    		int flag = 0;//标记是否出现零作为除数的情况
    		for(int i = len-1; i >= 0; i--)
    		{
    			if(s[i]>='0' && s[i]<='9')
    			{
    				tsum+=(s[i]-'0')*cc;
    				cc*=10;
    			}
    			else if(s[i] == '.')//小数
    			{
    				tsum = tsum/(cc*1.0);
    				cc = 1;
    			}
    			else if((s[i]=='+'||s[i]=='-') && tsum!=0)
    			{
    				if(s[i] == '+')
    				{
    					ss.push(tsum);
    					i--;//跳过下一个空格
    					continue;
    				}
    				else
    				{
    					tsum = -tsum;
    					ss.push(tsum);
    					i--;//跳过下一个空格
    					continue;
    				}
    
    			}
    			else if(s[i] == ' ')//当中一个运算数已经统计完
    			{
    				ss.push(tsum);
    				tsum = 0;
    				cc = 1;
    				continue;
    			}
    			else if(is_op(s[i]))//假设是运算符
    			{
    				double a = ss.top();
    				ss.pop();
    				double b = ss.top();
    				ss.pop();
    				double tt = 0;
    				if(s[i] == '+')
    					tt = a+b;
    				else if(s[i] == '-')
    					tt = a-b;
    				else if(s[i] == '*')
    					tt = a*b;
    				else if(s[i] == '/')
    				{
    					if(b == 0)
    					{
    						flag = 1;
    						break;
    					}
    					tt = a/b;
    				}
    				ss.push(tt);
    				i--;//跳过下一个空格
    			}
    		}
    		/*int k = 0;//记录最后栈内还剩有的数字有多少个,有多个则ERROR
    		int lenn = ss.size();
    		double tt;
    		for(int i = 0; i < lenn; i++)
    		{
    			tt = ss.top();
    			ss.pop();
    			if(!is_op(tt))
    			{
    				k++;
    			}
    		}
    		if(flag != 1)
    			printf("%.1lf
    ",tt);*/
    		if(flag != 1)
    			printf("%.1lf
    ",ss.top());
    		else
    			printf("ERROR
    ");
    	}
    	return 0;
    }
    


  • 相关阅读:
    C# WinForm TreeView改变选中节点颜色,失去焦点选中节点仍突显
    TextBox的ReadOnly属性设置为True后获取不到值
    如何设置打印机共享
    细节啊,不注意真是会很纠结
    设置access类型
    未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    带关闭的漂浮广告
    图片添加热点
    使用 WebDeploymentSetup VS 2010 Web项目部署
    动态操作表格
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4198274.html
Copyright © 2020-2023  润新知