将中缀表达式换成后缀表达式

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct
{
	char exp[100];
	int top;
}SqStack;
void InitStack(SqStack *&s)
{
	s=(SqStack *)malloc(sizeof(SqStack));
	s->top = -1;
}
bool Push(SqStack *&s,char e)
{
	if(s->top == MaxSize-1)
		return false;
	s->top++;
	s->exp[s->top] = e;
	return true;
}
bool GetTop(SqStack *s,char &e)
{
	if(s->top == -1)
		return false;
	e = s->exp[s->top];
	return true;
}
bool Pop(SqStack *&s,char &e)
{
	if(s->top == -1)
		return false;
	e = s->exp[s->top];
	s->top--;
	return true;
}
bool StackEmpty(SqStack *s)
{
	return (s->top == -1);
}
void DestroyStack(SqStack *&s)
{
	free(s);
}
void trans(char *exp,char postexp[])
{
	SqStack *Optr;
	char e;
	InitStack(Optr);
	int i=0;
	while(*exp != '\0')
	{
		switch(*exp)
		{
		case '(':
			Push(Optr,'('); //左括号进栈
			exp++; //继续扫描其他字符
			break;
		case ')':
			Pop(Optr,e); //右括号代表一个表达式的结束,出栈元素e
			while(e != '(') //继续出栈元素e,直到找到左括号
			{
				postexp[i++] = e;
				Pop(Optr,e);
			}
			exp++; //继续扫描其他元素
			break;
		case '+':
		case '-':
			while(!StackEmpty(Optr)) //当不为空栈时循环
			{
				GetTop(Optr,e); //取栈顶元素e
				if(e != '(') //e不是左括号时把元素e保存到post中,因为+ -优先级最小,碰到+-*/任意一个都需要让位
				{
					postexp[i++] = e;
					Pop(Optr,e);
				}
				else //接下来两步如果碰到左括号便把+-放到栈中
					break;
			}
			Push(Optr,*exp);
			exp++;
			break;
		case '*':
		case '/':
			while(!StackEmpty(Optr)) //当不为空栈时循环
			{
				GetTop(Optr,e); //取栈顶元素e
				if(e == '*' || e == '/') //因为*/的优先级较大,所以只考虑碰到 * / 时让位
				{
					postexp[i++] = e; //把e放到post中
					Pop(Optr,e); //继续出栈元素e
				}
				else
					break; //其他的情况都可以终止,让* /进栈
			}
			Push(Optr,*exp);
			exp++;
			break;
		default: //碰到数字时
			while(*exp >= '0' && *exp <= '9')
			{
				postexp[i++] = *exp;//直接进栈
				exp++;
			}
			postexp[i++] = '#'; //结尾用 # 分隔
		}
	}
	while(!StackEmpty(Optr)) //当扫描完一遍,但是栈中还有元素
	{
		Pop(Optr,e); //出栈
		postexp[i++] = e; 
	}
	postexp[i] = '\0'; //增加一个结束标志
	DestroyStack(Optr); //销毁栈
}
int main()
{
	char exp[]="(56-20)/(4+2)";
	char postexp[MaxSize];
	trans(exp,postexp);
	printf("中缀表达式:%s\n",exp);
	printf("后缀表达式:%s\n",postexp);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值