中缀转后缀表达式代码

中缀表达式转后缀表达式
遇到数字原样输出,遇到操作符入栈,入栈时要判断栈内已有的操作符的优先级和需要判断的操作符的优先级的大小
代码:
#define OPERATORS_PRIO_PLUS_IN  4  //栈内加法
#define OPERATORS_PRIO_SUB_IN  4   //栈内减法
#define OPERATORS_PRIO_MULTY_IN  2 //栈内乘法
#define OPERATORS_PRIO_DIV_IN  2   //栈内除法
#define OPERATORS_PRIO_LEFT_BRAK_IN  10  //栈内左括号

#define OPERATORS_PRIO_PLUS_OUT  5  //栈外加法
#define OPERATORS_PRIO_SUB_OUT   5   //栈外减法
#define OPERATORS_PRIO_MULTY_OUT  3 //栈外乘法
#define OPERATORS_PRIO_DIV_OUT  3   //栈外除法
#define OPERATORS_PRIO_LEFT_BRAK_OUT 1  //栈外左括号
#define OPERATORS_PRIO_RIGHT_BRAK_OUT 10  //栈外右括号
#define OPERATORS_PRIO_ERROR -1


#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
int Get_Prio(char opera, bool instack)
{
	int prio = OPERATORS_PRIO_ERROR;
	if (instack)
	{
		switch (opera)
		{
		case '+':
			prio = OPERATORS_PRIO_PLUS_IN;
			break;
		case '-':
			prio = OPERATORS_PRIO_SUB_IN;
			break;
		case '*':
			prio = OPERATORS_PRIO_MULTY_IN;
			break;
		case '/':
			prio = OPERATORS_PRIO_DIV_IN;
			break;
		case '(':
			prio = OPERATORS_PRIO_LEFT_BRAK_IN;
			break;
		default:
			prio = OPERATORS_PRIO_ERROR;
			break;
		}
	}
	else
	{
		switch (opera)
		{
		case '+':
			prio = OPERATORS_PRIO_PLUS_OUT;
			break;
		case '-':
			prio = OPERATORS_PRIO_SUB_OUT;
			break;
		case '*':
			prio = OPERATORS_PRIO_MULTY_OUT;
			break;
		case '/':
			prio = OPERATORS_PRIO_DIV_OUT;
			break;
		case '(':
			prio = OPERATORS_PRIO_LEFT_BRAK_OUT;
			break;
		case ')':
			prio = OPERATORS_PRIO_RIGHT_BRAK_OUT;
			break;
		default:
			prio = OPERATORS_PRIO_ERROR;
			break;
		}
	}
	return prio;
}
  bool MiddleToLast(char *strLast, const char *strMid)
{
	assert(*strMid != NULL&&*strLast != NULL);
	char*stack = (char*)malloc(sizeof(char)*strlen(strMid));
	assert(stack != NULL);
	int top = 0;
	while (*strMid != '\0')
	{
		if (isdigit(*strMid))
		{
			*strLast++ = *strMid++;
		}
		else
		{
			if (top==0)
			{
				stack[top++] =*strMid++;
			}
			else
			{
				if (Get_Prio(stack[top - 1], true) > Get_Prio(*strMid, false))  //栈外优先级高
				{
					stack[top++] == *strMid++;
				}
				else if (Get_Prio(stack[top - 1], true) == Get_Prio(*strMid, false))  //内外优先级一样
				{
					top--;
					*strMid++;
				}
				else if (Get_Prio(stack[top - 1], true) < Get_Prio(*strMid, false))  //栈内优先级高
				{
					*strLast++ = stack[--top];
				}
			}
		}
	}
	while (top!=0)
	{
		*strLast++ = stack[--top];
	}
	*strLast = '\0';
	free(stack);
	stack = NULL;
	return true;
}

void main()
{
	char *strMid = "5+1";
	char strLast[10];
	MiddleToLast(strLast, strMid);
	printf("%s\n", strLast);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值