中缀式变后缀式

题目来源

中缀式变后缀式

时间限制: 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 / =

先分析下中缀变后缀的思路:

得到一个中缀表达式字符串,并从头开始扫描:
A --数字时,加入后缀表达式.
B --运算符:
     a. 若为 '(', 直接入栈.
     b. 若为 ')', 则依次把栈中的的运算符加入后缀表达式中并出栈, 直到出现栈顶为 '(',并从栈中删除'(' .
     c. 若为 除括号外的其他运算符(即为 + - * /),  当其优先级高于除'('以外的栈顶运算符时,直接入栈。否则从栈顶开始,依次弹出比当前处理的运算        符优先级高和 优先级相等的运算符,直到一个比它优先级低的或者遇到了一个左括号为止。
     当扫描的中缀表达式结束时,栈中的的所有运算符出栈,并加入后缀表达式.

/*代码采用数组模拟栈,变量s相当于栈顶指针*/    
#include<stdio.h>
#include<string.h>
#define N 1000
int main()
{
	int s,t,T,i,len;
	char stack[N+1],str[N+1],ch[N+1];
	scanf("%d",&T);
	while(T--)
	{
		scanf("%s",str);//读取源数据
		len=strlen(str);//求出字符串长度
		s=-1;//"栈顶指针"
		t=0;

		/*下面根据思路开始遍历*/
		for(i=0;i<len-1;i++)//减一是为了在转换过程中不对最后一位的 = 操作
		{
			/*首先考虑运算符,优点是在出现多位数字时可以用循环直接处理,并为满足
			(相邻的操作数操作符用空格隔开)的题目要求带来方便*/
			if(str[i]=='(')//若为 ' ( ' 直接入栈
			{
				stack[++s]=str[i];
			}
			else if(str[i]==')')//若为 ' ) ',依次把栈中的的运算符加入后缀表达式中,直到出现'(',并从栈中删除'(' 
			{
				while(s>=0&&stack[s]!='(')
				{
					ch[t++]=stack[s];
					ch[t++] = ' ';
					  s--;
				}
				s--;//栈中删除出现的 ( 
			}
			/*以下分支很巧妙*/
			else if(str[i]=='/'||str[i]=='*' )//若为 * 或者 /
			{
				/*栈顶元素为*或/  优先级比当前运算符高或者相同,因为运算符只有+ - * / 和 () */
				while(stack[s]=='/'||stack[s]=='*')
				{
					ch[t++]=stack[s];//栈顶元素加入后缀表达式中
					ch[t++] = ' ';
					s--;//退栈一次
				}//循环结束时,说明栈顶元素的优先级低于当前运算符
				stack[++s]=str[i];//当前运算符进栈
			}
			else if(str[i]=='+'||str[i]=='-')//若为 + 或者 -
			{
				while(s>=0&&stack[s]!='(')
				{//栈中的运算符均高于或等于当前运算符,栈中运算符直接加入后缀表达式
					ch[t++]=stack[s];
					ch[t++] = ' ';
					s--;
				}
				stack[++s]=str[i];
			}
			else{/*处理数字(包括浮点型)*/
				while(str[i]<='9'&&str[i]>='0' || str[i] == '.'){
					ch[t++] = str[i++];
				}
				ch[t++]=' ';//数字后加一个空格
				i--;
			}
		}
		while(s>=0)//栈中的运算符均加入到后缀表达式
		{
			ch[t++]=stack[s];
			ch[t++] = ' ';
			s--;
		}
		ch[t++]= '=';//加入未处理的 = 
		ch[t++]= ' ';
		ch[t]='\0';//结束后缀表达式
		printf("%s\n",ch);
	}
	return 0;
} 


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值