• 【7013】编程求一个后缀表达式的值


    Time Limit: 1 second
    Memory Limit: 128 MB

    【问题描述】

    从键盘读入一个后缀表达式(字符串),只含有0~9组成的运算数及加减乘除四种运算符,每个运算数之间用一个空格隔开,运算数个数不超过30个,不需要判断给你的表达式是否合法,以@为结束标志。(不排除@后面还有内容)


    【输入格式】

    1行字符,每个数字后面用空格隔开,运算符不用空格。

    【输出格式】

    一行,运算出来的结果,结果保留整数。

    Sample Input

    16 9 4 3 +*-@
    
    
    
    
    
    
    

    Sample Output1

    -47

    【题解】
    这题的难度在于字符串的处理上。
    我们读入了一个字符串。但是我们不知道其是数字还是负号。所以要进行判断。
    如果s[0]∈[+ * /]则是符号。
    但是如果s[0] == '-',则需要后续判断因为这可能是一个负数。
    然后如果这个s的长度为1,则是符号。
    如果长度不为1,则看一下s[1]是否为数字,如果为数字,则我们读入的是一个数字。否则我们读入的是一
    系列的符号。
    读到符号就把栈顶的两个元素做相应的运算。下面那个 操作符 上面那个。
    然后top--;stack[top] = 运算结果。
    //而前缀表达式则是 上面那个 操作符 下面那个。
    会出现/*5这样的情况。即符号和数字连在了一起。要注意处理。
    【代码】
    #include <cstdio>
    #include <string>
    #include <iostream> 
    #include <stdlib.h>
    
    using namespace std;
    
    int top = 0;
    double stack[255];
    
    int main()
    {
    	//freopen("F:\rush.txt","r",stdin);
    	string s;
    	getline(cin,s);
    	int p = s.find('@',0);//先找到终止符的位置 
    	s = s.substr(0,p); //截出这段需要计算的后缀表达式 
    	s+=" ";//加一个空格。方便处理 
    	p = s.find(' ',0); //找空格的位置 
    	while (p!=-1)
    		{
    			string ss = s.substr(0,p); //截出需要判断的这段序列 
    			bool issymbol = false,isnumber = false; //用来判断是数字还是操作符 
    			if (ss[0]=='-') //如果第一个字符是一个负号则需要多重判断 
    				{
    					if (ss.size() == 1) //如果就只有一个负号,则是操作符 
    						issymbol = true;
    							else //否则 还要看一下第二个字符是什么 
    								if (ss[1] >='0' && ss[1] <='9') //如果第二个字符是数字,则是数字 
    									isnumber = true;
    				}
    				else 
    					if (ss[0] == '*' || ss[0] == '/' || ss[0] == '+') //如果是其他负号 则一定是符号 
    						issymbol = true;
    							else
    								isnumber = true;//否则就是数字 
    			if (isnumber) //如果是数字,则入栈 
    				{ 
    					top++;
    					stack[top] = atoi(ss.c_str()); //atoi是把字符转换成Int类型 
    				} 
    				else
    					{
    						int j = 0;
    						while (j <= ss.size()-1) //从第0个位置开始扫描 
    							{
    								if (ss[j] >='0' && ss[j] <='9') //如果在操作符中间出现了数字,则终止。并记录这个数字位置 
    									{//之后会把这个数字之前的字符截掉,然后我们会对这个掺杂的数字再进行处理(空格还在那里) 
    										p = j-1;
    										break;	
    									}
    								double x; //因为涉及到除法运算 所以用实型 
    								if (ss[j] == '*') //根据字符 做相应的运算即可。 
    									{	
    										x = stack[top-1]*stack[top];
    										top--;
    										stack[top] = x;
    									}
    								if (ss[j] == '-')
    									{
    										x = stack[top-1]-stack[top];
    										top--;
    										stack[top] = x;
    									}
    								if (ss[j] == '+')
    									{
    										x = stack[top-1]+stack[top];
    										top--;
    										stack[top] = x;
    									}
    								if (ss[j] == '/')
    									{
    										x = stack[top-1]/stack[top];
    										top--;
    										stack[top] = x;
    									}
    								j++;
    							}
    					}
    			s = s.erase(0,p+1);//连同空格一起删掉。 
    			p = s.find(' ',0);//然后继续找那个空格的位置 
    		}
    	printf("%.0lf",stack[top]);//要保留整数输出。 
    	return 0;
    } 



  • 相关阅读:
    Zabbix触发器支持的函数说明
    Zabbix Trigger表达式实例
    Nginx 504 Gateway Time-out问题解决
    题外话:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
    Vim快捷键分类
    [转]运维工作解释
    Cobbler的Web管理和维护
    使用 Cobbler 自动化和管理系统安装
    NTP时间服务器
    自动化部署必备技能—搭建YUM仓库
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632349.html
Copyright © 2020-2023  润新知