NYOJ--中缀式变后缀式

中缀式变后缀式

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述
人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和后缀式的论述一般的数据结构书都有相关内容可供参看,这里不再赘述,现在你的任务是将中缀式变为后缀式。
输入
第一行输入一个整数n,共有n组测试数据(n<10)。
每组测试数据只有一行,是一个长度不超过1000的字符串,表示这个运算式的中缀式,每个运算式都是以“=”结束。这个表达式里只包含+-*/与小括号这几种符号。其中小括号可以嵌套使用。数据保证输入的操作数中不会出现负数。
数据保证除数不会为0
输出
每组都输出该组中缀式相应的后缀式,要求相邻的操作数操作符用空格隔开。
样例输入
2
1.000+2/4=
((1+2)*5+1)/4=
样例输出
1.000 2 4 / + =
1 2 + 5 * 1 + 4 / =
来源

数据结构

解析:中缀表达式-->后缀表达式,用我上篇博客中的任一方法都能很快的AC了,注意这道题在输出的时候还要控制每个操作数和操作符之间有空格,且操作数不一定是一位的哈!所以也算是在那上面的加强版了,只需要在操作数的时候判断前面是否是操作符或者左括号(并且排除输入的第一个是左括号的情况),如果满足条件的话则先输出空格再输出操作数,另外在弹出操作符之前也要加上空格就好了哈!另外此类表达式转换以及求值的题还可以用编译原理中的递归下降分析,好像更高效,不过现在还没搞懂(有时间一定要看看哈!)

#include <iostream>
#include <string>
#include <stack>
using std::endl;
using std::cin;
using std::cout;
using std::string;
using std::stack;
//定义运算符的优先级
int priority(char ch)
{
	int num;
	switch(ch)
	{
	case '+':
	case '-':
		num=1;
		break;
	case '*':
	case '/':
		num=2;
		break;
	case '(':
	case ')':
		num=0;
		break;
	default:
		num=-1;
		break;
	}
	return num;
}
int main()
{
	int T;
	cin >> T;
	//定义保存运算符的栈
	stack<char> op;
	op.push('#');
	while(T--)
	{
		string str1,str2;
		cin >> str1;
		//将中缀表达式转换为后缀表达式
		for(int i=0;i<str1.length()-1;++i)
		{//扫描一遍输入的字符串进行转换
			if(str1[i]=='(')
			{
				op.push(str1[i]);
			}else if(str1[i]==')')
			{
				//遇到(则停止弹出
				while(op.top()!='(')
				{
					//操作符出栈之前打印空格
					str2+=' ';
					str2+=op.top();
					op.pop();
				}
				//将左括号从栈中弹出
				op.pop();
			}else if(str1[i]=='+'||str1[i]=='-'||str1[i]=='*'||str1[i]=='/')
			{
				//如果当前的操作符比栈顶的操作符优先级大的话,则将当前操作符压入栈
				if(priority(str1[i])>priority(op.top()))
				{
					op.push(str1[i]);
				}else{
					//当前运算符优先级小,则将栈中运算符优先级大于等于当前的都从栈中弹出来
					while(priority(op.top())>=priority(str1[i]))
					{
						//出栈之前打印空格
						str2+=' ';
						str2+=op.top();
						//将栈顶的运算符弹出
						op.pop();
					}
					//然后再压入当前的运算符
					op.push(str1[i]);
				}
			}else{
				//当是数字的时候或者小数点小数,判断是一个新的数,如果是则先打印空格
				if(i>1&&(str1[i-1]=='+'||str1[i-1]=='-'||str1[i-1]=='*'||str1[i-1]=='/'||str1[i-1]=='('))
					str2+=' ';
				str2+=str1[i];
			}
		}
		//如果此时符号栈仍不为空则全部出栈
		while(op.top()!='#')
		{
			//操作符出栈之前先打印空格
			str2+=' ';
			str2+=op.top();
			op.pop();
		}
		str2+=" =";
		cout << str2 << endl;
	}
	return 0;
}

孪生素数是指两个素数之间的差值为2的素数对。通过筛选法可以找出给定素数范围内的所有孪生素数的组数。 在引用的代码中,使用了递归筛选法来解决孪生素数问题。该程序首先使用循环将素数的倍数标记为非素数,然后再遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 具体实现过程如下: 1. 定义一个数组a[N,用来标记数字是否为素数,其中N为素数范围的上限。 2. 初始化数组a,将0和1标记为非素数。 3. 输入要查询的孪生素数的个数n。 4. 循环n次,每次读入一个要查询的素数范围num。 5. 使用两层循环,外层循环从2遍历到num/2,内层循环从i的平方开始,将素数的倍数标记为非素数。 6. 再次循环遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 7. 输出总数。 至此,我们可以使用这个筛选法的程序来解决孪生素数问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python用递归筛选法求N以内的孪生质数(孪生素数)](https://blog.csdn.net/weixin_39734646/article/details/110990629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NYOJ-26 孪生素数问题](https://blog.csdn.net/memoryofyck/article/details/52059096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值