一般表达式转化为后缀式

数据结构实验之栈二:一般算术表达式转换成后缀式
Time Limit: 1000MS Memory limit: 65536K
题目描述
对于一个基于二元运算符的算术表达式,转换为对应的后缀式,并输出之。
输入
输入一个算术表达式,以‘#’字符作为结束标志。
输出
输出该表达式转换所得到的后缀式。
示例输入
a*b+(c-d/e)*f#
示例输出
ab*cde/-f*+
# include <stdio.h>
# include <stdlib.h>
# define STACK_INIT_SIZE 100
# define STACKINCREMENT 10
typedef char SelemType;
typedef struct{
	SelemType *base;
	SelemType *top;
	int stacksize;
} SqStack;

void InitStack(SqStack&S);
void Push(SqStack&S,SelemType e);
void Pop(SqStack&S,SelemType&e);
bool StackEmpty(SqStack&S);
void GetTop(SqStack&S,SelemType&e);
int prority(char op);// 定义相关操作符的优先级
/* 中缀转后缀  栈用来存操作符*/
int main()
{
	int i=0;
	char etop,epop;
	SqStack S;
	InitStack(S);
    char str[100];
	gets(str);
	while(str[i]!='#')
	{
	    //字母直接输出
		if('a'<=str[i] && str[i]<='z')
			printf("%c",str[i]);
		else
		{
		    // 栈空进栈
			if(StackEmpty(S))
				Push(S,str[i]);
			else
			{
				GetTop(S,etop);                   //      prority(str[i])      pority(etop)
				if(prority(str[i]) >= prority(etop))   // 1 )                 (  */    + -
				{                                     //  2 (                    */    + -
				    // 是')'将栈中'('之上的操作符输出//   3 */                         + -
					if(prority(str[i]) == 4)        //    4 +/                         + -
					{
						while(etop!='(')
						{
							Pop(S,epop);
							printf("%c",epop);
							GetTop(S,etop);
						}
						Pop(S,epop);//弹出'('
					}
					else
					{
						Push(S,str[i]);
					}
				}                                   //      prority(str[i])      pority(etop)
				else                               //   5   + -                     */  (
				{                                  //  6   */                         (
					if(etop!='(')
					{
						Pop(S,epop);
						printf("%c",epop);
						Push(S,str[i]);
					}
					else
					{
						Push(S,str[i]);
					}
				}
			}
		}
		i++;
	}
	GetTop(S,etop);
	while(!StackEmpty(S))
	{
		printf("%c",etop);
		Pop(S,epop);
		GetTop(S,etop);
	}

	return 0;
}

void InitStack(SqStack&S)
{
	S.base = (SelemType*)malloc(STACK_INIT_SIZE*sizeof(SelemType));
	if(!S.base)
	{
		exit(0);
	}
	S.top = S.base;
	S.stacksize = STACK_INIT_SIZE;
}

void Push(SqStack&S,SelemType e)
{
	if(S.top - S.base >= S.stacksize)
	{
		S.base = (SelemType*)realloc(S.base,(STACK_INIT_SIZE + STACKINCREMENT) * sizeof(SelemType));
		if(!S.base)
		{
			exit(0);
		}
		S.top = S.base + S.stacksize;
		S.stacksize += STACKINCREMENT;
	}
	*S.top = e;
	S.top++;
	 //*S.top++ = e;
}

void Pop(SqStack&S,SelemType&e)
{
	if(S.top == S.base)
		return;
	else
	{
		//e = *--S.top;
		S.top--;
		e = *S.top;
	}
}
bool StackEmpty(SqStack&S)
{
	if(S.top == S.base)
		return true;
	else
		return false;
}
void GetTop(SqStack&S,SelemType&e)
{
	if(S.top == S.base)
		return;
	else
		e = *(S.top-1);
}
int prority(char c)
{
	if(c == '+' || c == '-')
		return 1;
	if(c == '*' || c == '/')
		return 2;
	if(c == '(')
		return 3;
	if(c == ')')
		return 4;
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值