表达式求值(牛客)

2023-05-16

题目描述:

给定一个字符串描述的算术表达式,计算出结果值。

输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。

输入描述:输入算术表达式(中缀表达式)

400+5

输出描述:计算出结果值

405

做题思路:

将输入的中缀表达式,转换为对应的后缀表达式进行计算

中缀表达式:5+4*6/2+3+(4*5)/5

对应的后缀表达式:5 4 6 * 2 / 3 + 4 5 * 5 / +

中缀表达式转为后缀表达式:

设置一个空栈S1

1.遇到操作数直接输出(输出的含义是指追加到当前后缀表达式后面

2.栈为空时,遇到运算符,直接入栈

3.遇到左括号时,直接入栈

4.遇到右括号时,如果栈顶的操作符不为左括号,一直出栈,并将出栈的操作符输出。当栈顶的操作符是左括号时,将左括号出栈, 停止本步骤。

5.遇到+-*/运算符op时,如果(栈非空 并且 栈顶操作符的优先级大于等于op时)一直将出栈,并将出栈的操作符输出。当(不满足栈非空 并且 栈顶操作符的优先级大于等于op)时,将op入栈

(栈非空 并且 栈顶操作符的优先级大于等于op时 指的是 满足加减优先级大于等于加减,乘除优先级大于等于加减乘除的情况,其他情况均视为不满足)

6.将栈中所有元素以此出栈输出

利用后缀表达式计算结果:

设置一个空栈S2

顺序扫描后缀表达式S1的每一项,然后根据当前项的类型做出相应的操作

1.如果当前项是操作数:将其压入栈S2中

2.如果当前项是操作符op:从S2弹出栈顶Y,在弹出栈顶X,计算 X<op>Y 并将结果压入栈 S2

当S1扫描结束,S2的栈顶元素值即为表达式的结果

注意事项:

#include<cstdlib>
string s;
int num = atoi(s.c_str());

#incldue<stack>
stack<char> s;
char c = s.top();
s.push('a');
s.pop(); //返回值是void

#include<cctype>
char c;
isdigit(c);
isalpha(c);

AC代码:

#include<iostream>
#include<cctype>
#include<vector>
#include<stack>
#include<string>
#include<cstdlib>

using namespace std;

bool Cmppriority(char s,char c); //比较操作符的优先级
vector<string> sTrans(string &str);//将中缀表达式转换为后缀表达式 
int Calculate(vector<string> res);//根据后缀表达式计算结果
 
int main()
{
	string str;
	cin >> str;
	
	vector<string> res = sTrans(str); 
	int result = Calculate(res);
	
	cout<<result<<endl;
	
	return 0;
} 

bool Cmppriority(char s,char c)
{
	if( (c=='*'||c=='/')&&(s=='*'||s=='/') ){
		return true;
	}
	if( (c=='+'||c=='-')&&(s=='+'||s=='-'||s=='*'||s=='/')){
		return true;
	}
	return false;
}
vector<string> sTrans(string &str)
{
	vector<string> result; //记录后缀表达式 
	stack<char> s;  //用作中间栈,调整符号在后缀表达式中的位置
	string temp; 
	
	for(int i=0; i<str.size(); i++){
		if( isdigit(str[i]) ){  //是一个操作数 
			temp="";
			while( i<str.size()&&isdigit(str[i]) ){
				temp += str[i];
				++i;
			}  
			i--;
			result.push_back(temp); //如果是操作符直接入栈到result
		}else{  //是一个操作符 
			if( s.empty() ){  //栈为空时操作符直接入栈到stack  
				s.push(str[i]);
			}else{
				if( str[i]=='(' ){
					s.push(str[i]);
				}else{
					if( str[i]==')' ){
						while( s.top()!='(' ){
							temp = "";
							temp += s.top();
							result.push_back(temp); //stack出栈 并 入栈到后缀表达式 
							s.pop();
						}
						s.pop(); //将左括号出栈 
					}else{  //遇到+-*/ 
						while( !s.empty()&&Cmppriority(s.top(),str[i]) ){
							temp = "";
							temp += s.top();
							result.push_back(temp);
							s.pop();
						}
						s.push(str[i]);
					}
				}
			}
		} 
	} 
	while( !s.empty() ){
		temp = "";
		temp += s.top();
		result.push_back(temp);
		s.pop();
	}
	return result; 
}
int Calculate(vector<string> res)
{
	stack<int> result;
	for(int i=0; i<res.size(); i++){
		if( isdigit(res[i][0]) ){ //是操作数 
			result.push(atoi(res[i].c_str())); 
		}else{
			int B = result.top();
			result.pop();
			int A = result.top();
			result.pop();
			
			if( res[i]=="+" ){
				result.push(A+B);
			}
			if( res[i]=="-" ){
				result.push(A-B);
			}
			if( res[i]=="*" ){
				result.push(A*B);
			}
			if( res[i]=="/" ){
				result.push(A/B);
			}
		}
	}
	return result.top();
} 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表达式求值(牛客) 的相关文章

随机推荐

  • 识别有效的IP地址和掩码进行分类统计(牛客)

    题目描述 xff1a 请解析IP地址和对应的掩码 xff0c 进行分类识别 要求按照A B C D E类地址归类 xff0c 不合法的地址和掩码单独归类 所有的IP地址划分为 A B C D E五类 A类地址1 0 0 0 126 255
  • 整数与IP地址间的转换(牛客)

    题目描述 xff1a 原理 xff1a ip地址的每段可以看成是一个0 255的整数 xff0c 把每段拆分成一个二进制形式组合起来 xff0c 然后把这个二进制数转变成 一个长整数 举例 xff1a 一个ip地址为10 0 3 193 每
  • C++中的qsort、sort排序

    注意 xff1a int char string之类的是可以之间使用 gt lt 61 61 之类的进行判断 xff0c char 类型的使用strcmp就行了 而struct与vector都可以当做数组进行处理 xff0c cmp函数传递
  • 迷宫问题(牛客)

    题目描述 xff1a 定义一个二维数组N M xff08 其中2 lt 61 N lt 61 10 2 lt 61 M lt 61 10 xff09 xff0c 如5 5数组下所示 xff1a int maze 5 5 61 0 1 0 0
  • 查找兄弟单词(牛客)

    题目描述 xff1a 兄弟单词 xff1a 给定一个单词X xff0c 如果通过任意交换单词中字母的位置得到的新的单词Y xff0c 那么称X和Y是兄弟单词 注意 xff1a bca和abc是兄弟单词 xff0c abc和abc是相同单词
  • 合唱团(牛客)

    题目描述 xff1a 计算最少出列多少位同学 xff0c 使得剩下的同学排成合唱队形 说明 xff1a N位同学站成一排 xff0c 音乐老师要请其中的 N K 位同学出列 xff0c 使得剩下的K位同学排成合唱队形 合唱队形是指这样的一种
  • 字符串排序(牛客)

    题目描述 xff1a 编写一个程序 xff0c 将输入字符串中的字符按如下规则排序 规则 1 xff1a 英文字母从 A 到 Z 排列 xff0c 不区分大小写 如 xff0c 输入 xff1a Type 输出 xff1a epTy 规则
  • 字符串加密(牛客)

    题目描述 xff1a 有一种技巧可以对数据进行加密 xff0c 它使用一个单词作为它的密匙 下面是它的工作原理 xff1a 首先 xff0c 选择一个单词作为密匙 xff0c 如TRAILBLAZERS 如果单词中包含有重复的字母 xff0
  • 统计每个月兔子的总数(牛客)

    题目描述 xff1a 有一只兔子 xff0c 从出生后第3个月起每个月都生一只兔子 xff0c 小兔子长到第三个月后每个月又生一只兔子 xff0c 假如兔子都不死 xff0c 问每个月的兔子总数为多少 xff1f 输入描述 xff1a 输入
  • 购物单(牛客)(01背包+分组背包+有依赖的背包)

    题目描述 xff1a 王强今天很开心 xff0c 公司发给N元的年终奖 王强决定把年终奖用于购物 xff0c 他把想买的物品分为两类 xff1a 主件与附件 xff0c 附件是从属于某个主件的 xff0c 下表就是一些主件与附件的例子 xf
  • gmssl 生成SM2证书、加密、解密、签名、验签

    1 生成SM2密钥对 gmssl ecparam genkey name sm2p256v1 out sm2keypair pem text 2 查看SM2密钥对 gmssl ec in sm2keypair pem text 3 生成自签
  • 求小球落地5次后所经历的路程和第五次反弹的高度(牛客)

    题目描述 xff1a 假设一个球从任意高度自由落下 xff0c 每次落地后反跳回原高度的一半 再落下 求它在第5次落地时 xff0c 共经历多少米 第5次反弹多高 xff1f 最后的误差判断是小数点6位 输入描述 xff1a 输入起始高度
  • 输入一行字符,分别统计出包含英文字符、空格、数字和其他字符的个数(牛客)

    题目描述 xff1a 输入一行字符 xff0c 分别统计出包含英文字母 空格 数字和其它字符的个数 输入描述 xff1a 输入一行字符串 xff0c 可以有空格 1qazxsw23 edcvfr45tgbn hy67uj m ki89ol
  • 字符串合并处理(牛客)

    题目描述 xff1a 按照指定规则对输入的字符串进行处理 详细描述 xff1a 将输入的两个字符串合并 对合并后的字符串进行排序 xff0c 要求为 xff1a 下标为奇数的字符和下标为偶数的字符分别从小到大排序 这里的下标意思是字符在字符
  • 蛇形矩阵(牛客)

    题目描述 xff1a 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形 输入描述 xff1a 输入正整数N xff08 N不大于100 xff09 5 输出描述 xff1a 输出一个N行的蛇形矩阵 1 3 6 10 15 2 5 9
  • 图片整理(牛客)

    题目描述 xff1a Lily上课时使用字母数字图片教小朋友们学习英语单词 xff0c 每次都需要把这些图片按照大小 xff08 ASCII码值从小到大 xff09 排列收好 请大家给Lily帮忙 xff0c 通过C语言解决 输入描述 xf
  • 单词倒排(牛客)

    题目描述 xff1a 对字符串中的所有单词进行倒排 说明 xff1a 1 构成单词的字符只有26个大写或小写英文字母 xff1b 2 非构成单词的字符均视为单词间隔符 xff1b 3 要求倒排后的单词间隔符以一个空格表示 xff1b 如果原
  • 字符串运用-密码截取(牛客)

    题目描述 xff1a xff08 最大回文序列 xff09 Catcher是MCA国的情报员 xff0c 他工作时发现敌国会用一些对称的密码进行通信 xff0c 比如像这些ABBA xff0c ABA xff0c A xff0c 12332
  • 字符串加解密(牛客)

    题目描述 xff1a 1 对输入的字符串进行加解密 xff0c 并输出 2加密方法为 xff1a 当内容是英文字母时则用该英文字母的后一个字母替换 xff0c 同时字母变换大小写 如字母a时则替换为B xff1b 字母Z时则替换为a xff
  • 表达式求值(牛客)

    题目描述 xff1a 给定一个字符串描述的算术表达式 xff0c 计算出结果值 输入字符串长度不超过100 xff0c 合法的字符包括 43 xff0c 0 9 xff0c 字符串内容的合法性及表达式语法的合法性由做题者检查 本题目只涉及整