题目描述 给定一个仅由++、−−、整数、空格组成的计算式(中缀表达式),将其转换为对应的后缀表达式(即逆波兰表达式)。 输入描述 一个长度不超过100的字符串,仅由+、−、整数(不小于1且不大于9)、空格组成,其中操作符和操作数之间用空格分隔。数据保证表达式一定合法。 输出描述 输出对应的后缀表达式,其中操作数和操作符之间用空格隔开,行末不允许有多余的空格。 样例输入1 3 + 4 - 5 样例输出1 3 4 + 5 -c语言实现
时间: 2024-02-05 19:11:48 浏览: 74
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LENGTH 100 // 定义字符串最大长度
char stack[MAX_LENGTH]; // 定义栈
int top = -1; // 栈顶指针
// 判断是否为操作符(即+、-)
int isOperator(char c) {
return c == '+' || c == '-';
}
// 获取操作符优先级
int getPriority(char c) {
return c == '+' || c == '-' ? 1 : 0;
}
// 将中缀表达式转换为后缀表达式
void infixToPostfix(char *infix, char *postfix) {
int i = 0, j = 0; // i为读取字符的下标,j为写入字符的下标
int len = strlen(infix);
for (i = 0; i < len; i++) {
char c = infix[i];
if (isdigit(c)) { // 如果是数字,直接写入后缀表达式
postfix[j++] = c;
} else if (isOperator(c)) { // 如果是操作符
while (top >= 0 && isOperator(stack[top]) && getPriority(stack[top]) >= getPriority(c)) { // 判断栈顶的操作符优先级是否大于等于当前操作符
postfix[j++] = stack[top--]; // 弹出栈顶的操作符并写入后缀表达式
}
stack[++top] = c; // 当前操作符入栈
} else if (c == ' ') { // 如果是空格,忽略
continue;
}
}
// 将栈中剩余的操作符弹出并写入后缀表达式
while (top >= 0) {
postfix[j++] = stack[top--];
}
}
int main() {
char infix[MAX_LENGTH], postfix[MAX_LENGTH];
fgets(infix, MAX_LENGTH, stdin); // 读入中缀表达式
infixToPostfix(infix, postfix); // 转换为后缀表达式
printf("%s", postfix); // 输出后缀表达式
return 0;
}
```
阅读全文