• 算术表达式


    题目描述:
        读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
    输入:
        测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
    输出:
        对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
    样例输入:
    1 + 2
    4 + 2 * 5 - 7 / 11
    0
    样例输出:
    3.00
    13.36

    思路:

    栈,后缀表达式。

    中缀表达式->后缀表达式:栈中的操作符从栈顶到栈底 严格递减(即保证push到符号栈的符号必然比栈顶符号优先级高,否则pop)

    #include "iostream"
    #include "stdio.h"
    #include "math.h"
    #include "vector"
    #include "stack"
    #include "queue"
    #include "memory.h"
    #include "algorithm"
    #include "string"
    using namespace std;
    
    char e[250],post[250];
    stack<char>Op;
    
    bool Isnum(char c)
    {
    	if(c>='0'&&c<='9')
    		return true;
    	return false;
    }
    
    int OPMode(char c)
    {
    	if(c=='+')		return 1;
    	if(c=='-')		return 2;
    	if(c=='*')		return 3;
    	if(c=='/')		return 4;
    	return -1;
    }
    
    void SplitExp(char* s)
    {
    	int i,j=0;
    	memset(post,'',sizeof(post));
    	for(i=0;i<strlen(s);i++)
    	{
    		if(s[i]==' ')
    			continue;
    		post[j++]=' ';
    		while(Isnum(s[i]))
    			post[j++]=s[i++];
    		int curop=OPMode(s[i]);
    		if(curop!=-1)
    		{
    			if(curop<=2)
    				while(!Op.empty())
    				{
    					post[j++]=Op.top();
    					Op.pop();
    				}
    			else
    			{
    				while(!Op.empty()&&OPMode(Op.top())>2)
    				{
    					post[j++]=Op.top();
    					Op.pop();
    				}
    			}
    			Op.push(s[i])	;
    		}
    	}
    	while(!Op.empty())
    	{
    		post[j++]=Op.top();
    		Op.pop();
    	}
    }
    
    stack<double>Num;
    double Cal()
    {
    	while(!Num.empty())
    		Num.pop();
    	int i=0,j;
    	int len=strlen(post);
    	while (i++<len)
    	{
    		if(post[i]==' ')
    			continue;
    		double cur=0;
    		bool hasnum=false;
    		while (Isnum(post[i]))
    		{
    			cur*=10;
    			cur+=post[i++]-'0';
    			hasnum=true;
    		}
    		if(hasnum)
    			Num.push(cur);
    		if(OPMode(post[i])!=-1)
    		{
    			double num1=Num.top();
    			Num.pop();
    			double num2=Num.top();
    			Num.pop();
    			switch(post[i])
    			{
    			case '+':		Num.push(num2+num1);break;
    			case '-':		Num.push(num2-num1);break;
    			case '*':		Num.push(num2*num1);break;
    			case '/':		Num.push(num2/num1);break;
    			}
    		}
    	}
    	return Num.top();
    }
    
    int main()
    {
    	while(gets(e))
    	{
    		if(strcmp(e,"0")==0)
    			break;
    		SplitExp(e);
    		printf("%.2f
    ",Cal());
    	}
    }


  • 相关阅读:
    第一次练习总结
    第一次上机总结
    写在程序组干活之前
    虚拟机Centos7安装Mysql
    第一章 开发体验
    如何优雅的移植JavaScript组件到Blazor
    Asp.net core中RedisMQ的简单应用
    docker容器安装mysql
    Centos 8安装Docker
    c# 定时启动一个操作、任务(版本2)
  • 原文地址:https://www.cnblogs.com/hainange/p/6334070.html
Copyright © 2020-2023  润新知