后缀表达式转换

#include <stdio.h>

#define Maxsize 20

typedef struct SNode{
	char Data[Maxsize];
	int Top;
}*Stack;

int compare(char a,char b)
{
	int Nothigher=0;	
	if(!((a=='*'||a=='/')&&(b=='+'||b=='-'||b=='(')||((a=='+'||a=='-')&&b=='(')))	
		Nothigher=1;
	return Nothigher;
}

void Push(char X,Stack S)
{
	S->Data[++(S->Top)]=X; 
}

void Pop(Stack S)
{
	if(S->Data[S->Top]=='(')
		S->Top--;
	else 
		printf(" %c",S->Data[(S->Top)--]);
}

int main()
{
	Stack S=(Stack)malloc(sizeof(struct SNode));
	S->Data[Maxsize]=(char)malloc(Maxsize*sizeof(char));
	char str[Maxsize]="";
	int i;
	for(i=0;(str[i]=getchar())!='\n';i++);
	i--;
	int j;
	int flag1=0,flag2=0,flag3=0;
//flag1 判断是否是连续的数字,连续数字直接无需空格;
//flag2 判断是否是第一次输出,第一次输出前无空格; 
//flag3 判断减号是否是负号,依据是其前一位不是数字和右括号 
	S->Top = -1;//初始化 
	for(j=0;j<=i;j++)
	{
		if((str[j]>='0'&&str[j]<='9')||str[j]=='.')//属于数字部分,直接输出   
		{
			if(flag1==0&&flag2!=0)//上一字符不为数字&&不是首次输出 
				printf(" ");
			printf("%c",str[j]);
			flag1=1;//此字符为数字 
			flag2=1;//已输出,不再是首次输出 
			flag3=1;//此字符为数字
		}	
		else if(str[j]=='(')
		{
			flag1=0;//此字符非数字 
			Push(str[j],S);
			flag3=0;//此字符非数字非右括号
		}
		else if(str[j]==')')
		{
			flag1=0;//此字符非数字 
			while(S->Data[S->Top]!='(')
			{
				Pop(S);
			}
			Pop(S);
			flag3=1;//此字符为右括号 
		}
		else
		{
			if(str[j]=='-'&&flag3==0)//判断"-"号是否为负号 
			{
				if(flag2!=0)//非首字符 
					printf(" ");
				printf("%c",str[j]);
				flag1=1;//此字符为负号,属于数字部分 
				continue;
			}	
			if(S->Top!=-1)
			{
				while(compare(str[j],S->Data[S->Top])&&S->Top>=0)
				{
					Pop(S);
				}	
			}	
			Push(str[j],S);
			flag1=0;//此字符非数字 
			flag3=0;//此字符非数字非右括号 
		}
	}
	while(S->Top>=0)
	{
		Pop(S);
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42348049/article/details/80772154