带括号的中缀表达式转后缀表达式

本文介绍了一个使用栈实现的中缀表达式转后缀表达式的算法,并提供了详细的C语言实现代码。该算法通过定义运算符优先级来正确处理括号及不同运算符的先后顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include "SeqStack.h"
//对扩展开放,对修改封闭
//修改一下运算符
int Is_OperatorEx(char op) {
	switch (op)
	{
	case '(':
	case ')':
	case '+':
	case '-':		
	case '*':
	case '/':
		return 1;
	default:
		return 0;
	}
}

int PriorityEx(char op) {
	switch (op)
	{
	case '(':return 1;
	case '+':
	case '-':return 2;
	case '*':
	case '/':
		return 3;
	default:
		return 0;
	}
}

int main21(void) {
	char inorder[50] = "1+2-3#"; //"1+((2+3)*4)-5#";//声明中缀(中序)表达式的字符串
	char postorder[50];
	int op = 0;//运算符
	int in_position;//中序表达式的角标
	int po_position;//后续表达式的角标
	int i;
	in_position = 0;
	po_position = 0;
	for (i = 0;i < 50;i++)
		postorder[i] = 0;
	SeqStack sOper;
	init(&sOper);

	while (inorder[in_position]!='#')
	{
		//todo利用栈进行优先级,去括号的过程 
		if (Is_OperatorEx(inorder[in_position])) {
			if (isEmpty(&sOper) || inorder[in_position] == '(') {
				pushStack(&sOper, inorder[in_position]);
			}
			else {
				if (inorder[in_position] == ')') {
					//匹配左括号
					
					while (sOper.stack[sOper.top] != '(') {
						op = popStack(&sOper);
						postorder[po_position++] = op;
					}
					if (sOper.stack[sOper.top] == '(')
					{
						popStack(&sOper);
					}
				}//ctrl+]
				else
				{
					while (PriorityEx(inorder[in_position]) <= PriorityEx(sOper.stack[sOper.top]) && !isEmpty(&sOper)) {
						op = popStack(&sOper);
						postorder[po_position++] = op;
					}
					pushStack(&sOper, inorder[in_position]);
				}
			}

		}
		else {
			postorder[po_position++] = inorder[in_position];
		}

		in_position++;
	}

	while (!isEmpty(&sOper)) {
		op = popStack(&sOper);
		postorder[po_position++] = op;
	}
	for (int i = 0;i < 50;i++) {
		if (postorder[i] == 0)
			break;
		printf("%c", postorder[i]);
	}


	getchar();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值