6.从中缀向后缀转换表达式

该博客介绍如何将中缀表达式转换为后缀(逆波兰)表达式,重点在于使用栈数据结构来处理正确的数学公式。示例中,给定的中缀表达式如(A-(B*C+D)*E)/(F+G),转换后的后缀表达式为:ABC*D+E*+-FG+/。程序设计要求简化,仅考虑单字母变量、基础运算符和正确括号使用。
摘要由CSDN通过智能技术生成

6.从中缀向后缀转换表达式

成绩 10 开启时间 2014年10月26日 Sunday 14:00
折扣 0.8 折扣时间 2014年11月9日 Sunday 23:55
允许迟交 关闭时间 2014年11月23日 Sunday 23:55

问题描述

  中缀表达式就是我们通常所书写的数学表达式,后缀表达式也称为逆波兰表达式,在编译程序对我们书写的程序中的表达式进行语法检查时,往往就可以通过逆波兰表达式进行。我们所要设计并实现的程序就是将中缀表示的算术表达式转换成后缀表示,例如,将中缀表达式

(A 一 (B*C 十 D)*E) / (F 十 G )

转换为后缀表示为:

ABC*D十E*—FG十/

注意:为了简化编程实现,假定变量名均为单个字母,运算符只有+,-,*,/ 和^(指数运算),可以处理圆括号(),并假定输入的算术表达式正确。

要求:使用栈数据结构实现 ,输入的中缀表达式以#号结束

输入

整数N。表示下面有N个中缀表达式 
N个由单个字母和运算符构成的表达式

输出

N个后缀表达式。

  测试输入关于“测试输入”的帮助 期待的输出关于“期待的输出”的帮助 时间限制关于“时间限制”的帮助 内存限制关于“内存限制”的帮助 额外进程关于“{$a} 个额外进程”的帮助
测试用例 1 以文本方式显示
  1. 1↵
  2. (A-(B*C+D)*E)/(F+G)#↵
以文本方式显示
  1. ABC*D+E*-FG+/↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 2↵
  2. a+b*c-d#↵
  3. a-b*(c+d)#↵
以文本方式显示
  1. abc*+d-↵
  2. abcd+*-↵
1秒 64M 0
#include<stdio.h>
#include<string.h>
int cmp(char a, char b)
{
	if (a == '(')
		return -1;
	if (a == b&&a=='^')
		return -1;
	if (a == b)
		return 1;
	if ((a == '*' || a == '/') && (b == '+' || b == '-'))
		return 1;
	if ((a == '+' || a == '-') && (b == '*' || b == '/'))
		return -1;
	if (a != '^'&&b == '^')
		return -1;
	if (a == '^'&&b != '^')
		return 1;
	if ((a == '+' || a == '-') && (b == '+' || b == '-'))
		return 1;
	if ((a == '*' || a == '/') && (b == '*' || b == '/'))
		return 1;
}
int main()
{
	int N;
	char StackOperator[1000];
	char map[1000];
	int p;
	int len;
	int i;
	scanf("%d", &N);
	while (N--){
		memset(StackOperator, 0, sizeof(StackOperator));
		memset(map, 0, sizeof(map));
		StackOperator[0] = '\0';
		p = 1;
		scanf("%s", map);
		len = strlen(map);

		for (i = 0; i < len - 1; i++){
			if ((map[i] >= 'a'&&map[i] <= 'z') || (map[i] >= 'A'&&map[i] <= 'Z'))
				printf("%c", map[i]);
			else{
				if (map[i] == '('){
					StackOperator[p] = map[i];
					p++;
				}
				else{
					if (map[i] == ')'){
						while (1){
							if (StackOperator[p-1] == '('){
								p--;
								break;
							}
							else{
								printf("%c", StackOperator[p-1]);
								p--;
							}
						}
					}
					else{
						if (cmp(StackOperator[p-1], map[i]) < 0){
							StackOperator[p] = map[i];
							p++;
						}
						else{
							while (1){
								if (cmp(StackOperator[p - 1], map[i])>0){
									printf("%c", StackOperator[p - 1]);
									p--;
								}
								else{
									StackOperator[p] = map[i];
									p++;
									break;
								}
							}
						}
					}
				}
			}
		}
		while (1){
			if (StackOperator[p - 1] != '\0'){
				printf("%c", StackOperator[p - 1]);
				p--;
			}
			else{
				break;
			}
		}
		printf("\n");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值