关闭

中缀表达式变后缀表达式 nyoj467

215人阅读 评论(0) 收藏 举报
分类:
/*中缀式变后缀式思想
	运算符等级
	'*''/'>'+''-'>'('>')'
	如果运算符栈为空,运算符入栈,
	如果运算符不为‘)’,且栈顶运算符不为'('
	则比较运算符优先级,若栈顶优先级更高,则将栈顶元素移至数字栈,否则符号入栈

*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int isop(char a);//判断是否为符号
void rechan(char expre[],char number[],char opera[],int length);//进行后缀表达式变前缀
char popop(char a[]);//符号出栈
void pushop(char a[],char b);//符号入栈
int isbig(char a,char b);//判断俩个运算符优先级
char getop(char a[]);//取栈顶元素
int oplevel(char a);//为运算符打上级别;
int optop=0;//指向栈顶运算符
int main()
{
	char s[10000],num[10000],op[10000];
	int len;
	int ncase;
	scanf("%d",&ncase);
	while (ncase--)
	{
		memset(s,0,sizeof(s));
		scanf("%s",s);
		len=strlen(s);
	rechan(s,num,op,len);
	}

	return 0;
}
void rechan(char expre[],char number[],char opera[],int length)
{
	int i,j,flag,q;
	char tmp[10000];
	j=0;
	for (i=0;i<length;i++)
	{
		flag=1;
		if (i==length-1)
		{
			break;
		}
		if (isop(expre[i]))
		{
			while(flag)
			{
				
				if (optop==0||expre[i]=='(')
				{
					pushop(opera,expre[i]);
					flag=0;
				}
			
				else
				{
					if (expre[i]==')')
					{
						while (getop(opera)!='(')
						{	
							tmp[j++]=popop(opera);	
							tmp[j++]=' ';
						}
						optop--;
						flag=0;
					}
					else if(isbig(expre[i],getop(opera)))
					{
						pushop(opera,expre[i]);
						flag=0;
					}
					else 
					{
						tmp[j++]=popop(opera);	
						tmp[j++]=' ';
					}
					
			}
			}
		}
		else
		{
			while(!isop(expre[i])&&expre[i]!='=')
			{
			 	tmp[j++]=expre[i++];
			}
			tmp[j++]=' ';
			i--;		
		}
	}
	q=optop;
	for (i=0;i<q;i++)
	{
		tmp[j++]=popop(opera);
		tmp[j++]=' ';
	}
	tmp [j++]='=';
	tmp [j]='\0';
	printf("%s\n",tmp);
}
char popop(char a[])
{
	return a[--optop];
}
char getop(char a[])
{
	return a[optop-1];
}
int isbig(char a,char b)
{
	if (oplevel(a)>oplevel(b))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int oplevel(char a)
{
	switch (a)
	{
	case '+':
	case '-':return 3;
	case '*':
	case '/':return 4;
	case '(':return 2;
	case ')':return 1;
	default: return 0;
	}
}
void pushop(char a[],char b)
{
	a[optop++]=b;
}
int isop(char a)
{
	if (a=='+'||a=='-'||a=='*'||a=='/'||a=='('||a==')')
	{
		return 1;
	}
	else
		 return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11146次
    • 积分:364
    • 等级:
    • 排名:千里之外
    • 原创:23篇
    • 转载:15篇
    • 译文:0篇
    • 评论:0条