栈---中缀表达式转后缀表达式C语言代码实现
时间: 2024-10-05 20:00:41 浏览: 48
数据结构实验报告-栈与队列-中缀表达式转换为后缀式5分-实验内容及要求.docx
5星 · 资源好评率100%
中缀表达式转后缀表达式(也称为逆波兰表示法,Reverse Polish Notation,RPN),可以通过栈数据结构来完成。以下是简单的C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义运算符优先级
#define PRECEDENCE(op) ((op)=='+' || (op)=='-' ? 1 : ((op)=='*' || (op)=='/' ? 2 : 0))
void infixToRPN(char* input, char* output) {
stack<int> s;
int i = 0;
while (input[i] != '\0') {
if (isalnum(input[i])) { // 遇到数字,直接放入output
output[strlen(output)] = input[i];
output[strlen(output) + 1] = '\0';
i++;
} else if (input[i] == '(') { // 遇到左括号,入栈
s.push(i);
} else if (input[i] == ')') { // 遇到右括号,直到左括号出栈
while (!s.empty() && input[s.top()] != '(')
output[strlen(output)] = input[s.pop()];
s.pop(); // 出栈左括号
} else { // 遇到操作符
while (!s.empty() && precedence(input[i]) <= precedence(input[s.top()])) {
output[strlen(output)] = input[s.pop()];
}
s.push(i);
}
i++;
}
// 把剩余的操作符依次压入结果
while (!s.empty()) {
output[strlen(output)] = input[s.pop()];
}
}
int main() {
char input[] = "A+B*C-(D+E)";
char output[100];
infixToRPN(input, output);
printf("Infix expression: %s\n", input);
printf("Postfix expression: %s\n", output);
return 0;
}
```
这段代码首先定义了一个栈,遍历输入的中缀表达式。遇到数字直接加入输出,遇到左括号就入栈,遇到右括号则将左括号与之对应的运算符全部出栈。最后,把剩余的操作符依次压入结果。
运行这段代码会得到从给定的中缀表达式转换成的后缀表达式。
阅读全文