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

原创 2013年12月02日 11:05:40
/*中缀式变后缀式思想
	运算符等级
	'*''/'>'+''-'>'('>')'
	如果运算符栈为空,运算符入栈,
	如果运算符不为‘)’,且栈顶运算符不为'('
	则比较运算符优先级,若栈顶优先级更高,则将栈顶元素移至数字栈,否则符号入栈

*/
#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;
}

相关文章推荐

中缀变后缀表达式

  • 2012年11月21日 19:15
  • 2KB
  • 下载

NYOJ 257 中缀表达式表示成后缀表达式

话说这道题代码那个丑陋啊,,写出来我自己都不想再看第二遍啊。。。看了看聪神的代码,还消耗我3个NYOJ币啊,,更扯得是,聪神的代码我看不懂啊,,,,卧槽。。。这道题不再多说了,数据结构上有详细的介绍,...
  • wmn_wmn
  • wmn_wmn
  • 2012年03月24日 11:11
  • 924

java中缀变后缀表达式

  • 2007年08月10日 15:44
  • 1KB
  • 下载

数据结构(C++实现):栈的运用--中缀表达式转换为后缀表达式既 nyoj 257

这题用了c++提供的封装了,没有写手工栈,手工栈的代码等实验结束后再上传。        题目链接http://acm.nyist.net/JudgeOnline/problem.php?pid=2...
  • TheHide
  • TheHide
  • 2015年11月19日 15:24
  • 1768

NYOJ 467 中缀式变后缀式

中缀式变后缀式 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述人们的日常习惯是把算术表达式写成中缀式,但对于机器来说更“习惯于”后缀式,关于算术表达式的中缀式和...

NYOJ 35 表达式求值 【中缀转后缀+后缀表达式求值】

题目链接:cm.nyist.net/JudgeOnline/problem.php?pid=35 题目大意:给你一个数学表达式,求出结果。 分析:表达式求值一般都是模拟,但模拟的时候也有些小技...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中缀表达式变后缀表达式 nyoj467
举报原因:
原因补充:

(最多只允许输入30个字)