中缀表达式变后缀表达式 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;
}

栈与队列(三)中缀表达式转后缀表达式

中缀表达式=》后缀(逆波兰)表达式 例如:1+2=>1 2 + 分析原理:利用栈的记忆,符号推入栈,数字直接输出,当然有些时候在推入符号前,要先将栈内的元素Pop出来计算,再压入 具体分析1+(2...
  • w_linux
  • w_linux
  • 2017年02月09日 18:20
  • 487

【表达式求值】中缀表达式转变为后缀表达式

参考blog:http://blog.csdn.net/Gengman/article/details/70236885#reply; 1.什么是中缀表达式     中缀表达式就是我们正常写的表达...
  • baidu_35643793
  • baidu_35643793
  • 2017年04月26日 20:56
  • 268

C++中缀表达式转换后缀表达式

#include #include using namespace std; void inToPostfix() { stack s; char token; cin>...
  • llq108
  • llq108
  • 2013年11月23日 23:14
  • 1541

C语言 实现中缀表达式转后缀表达式并求值

大一菜鸟,初学编程,这是我的第一篇博客,希望能用博客记录我的成长之路。 初学数据结构,刚接触链表和栈,看到有中缀表达式转后缀的题就试着实现了一下。下面贴上代码。因为使用的是字符型变量,所以只能计算个位...
  • wait_nothing_alone
  • wait_nothing_alone
  • 2016年04月16日 18:48
  • 1805

中缀表达式变后缀分析

将中缀变为相应的后缀,需要根据的优先级来进行栈的变化 一般以icp(in coming priority)表示栈外优先isp(in stack priority)表示栈内优先int icp (cha...
  • u011240016
  • u011240016
  • 2016年10月29日 23:19
  • 307

中缀表达式转后缀表达式--C# 代码实现

使用计算机进行表达式的转换 平常我们用的标准四则运算表达式,如“1+(2-3)*4/5”叫做中缀表达式,,, 中缀转后缀表达式的规则是: 从左到右变量中缀表达式的每个数字和符号,若是数字就输出,即...
  • Czhenya
  • Czhenya
  • 2017年09月22日 22:23
  • 283

中缀表达式转换为后缀表达式 简易实现(c++)(简易表达式计算)

最近在学数据结构,看《数据结构与算法分析》来自学,在看到表 栈 队列这一章的时候发现后缀表达式这个比较好玩的东西,因为以前计算表达式的时候都是直接对中缀表达式进行处理,而且比较麻烦,现在有了后缀表达式...
  • charlie_heng
  • charlie_heng
  • 2017年02月26日 19:20
  • 821

C# 堆栈例子--中缀表达式转为后缀表达式

中缀表达式是什么?中缀表达式是一个通用的算术或逻辑公式表示方法,其表达式中操作符处于操作数的中间。例如表达式:(3+67)×5 , x&&(y|c)中缀表达式不容易被电脑解析,但仍被许多程序语言使用,...
  • fan158
  • fan158
  • 2010年04月07日 16:39
  • 3437

中缀表达式转换成前缀表达式和后缀表达式的极其简单方法

35,15,+,80,70,-,*,20,/               //后缀表达方式 (((35+15)*(80-70))/20)=25           //中缀表达方式   /,*...
  • yu757371316
  • yu757371316
  • 2015年09月15日 01:13
  • 2942

中缀表达式转后缀表达式并进行计算 原理

在计算一个表达式的时候,可以用数据结构中栈的知识,将我们平常熟悉的中缀表达式转为后缀表达式,再将后缀表达式进行计算得到结果。先说下什么是中缀什么是后缀: 中缀表达式:eg: 9+(3-1)*3+10/...
  • sdr_zd
  • sdr_zd
  • 2016年08月04日 18:01
  • 624
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:中缀表达式变后缀表达式 nyoj467
举报原因:
原因补充:

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