请用c语言来写一个中缀表达式转前缀的程序
时间: 2024-12-20 22:28:14 浏览: 3
c语言实现中缀表达式向后缀表达式转换
5星 · 资源好评率100%
中缀表达式转换成前缀表达式,也称为逆波兰表示法(Reverse Polish Notation,RPN),可以利用栈的数据结构。下面是一个简单的C语言程序示例,用于将中缀表达式转换为前缀表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TOKENS 100
typedef struct {
char *token;
int precedence;
} Token;
Token tokens[MAX_TOKENS];
int top = -1;
void push(char token) {
if (top == MAX_TOKENS - 1) {
printf("Error: Stack overflow.\n");
exit(1);
}
tokens[++top].token = &tokens[top + 1];
*tokens[top].token = token;
tokens[top].precedence = 0; // 这里假设所有非操作符的优先级都是0
}
char pop() {
return top >= 0 ? tokens[top].token[0] : 'EOF';
}
int isOperator(char c) {
switch (c) {
case '+':
case '-':
case '*':
case '/':
return 1;
default:
return 0;
}
}
void infixToPrefix(char *infixExp) {
char *p = infixExp;
while (*p != '\0') {
if (!isOperator(*p)) { // 非操作符直接入栈
push(*p++);
} else { // 操作符处理
char op = *p++;
while (top > 0 && isOperator(tokens[top].token[0]) && tokens[top].precedence >= op.precedence) {
push(tokens[top].token[0]);
top--;
}
tokens[top].token[0] = op;
tokens[top++].precedence = op.precedence;
}
}
while (top > 0) {
push(tokens[top].token[0]);
top--;
}
}
// 示例输入和输出函数
void printExpression(char *prefixExp) {
for (int i = 0; i <= top; i++) {
printf("%s ", prefixExp[i]);
}
printf("\n");
}
int main() {
char infixExp[] = "A+B*C";
char prefixExp[strlen(infixExp) + 1]; // 前缀表达式的最大长度
infixToPrefix(infixExp);
printExpression(prefixExp); // 输出前缀表达式
return 0;
}
```
这个程序首先定义了一个栈`tokens`来存储操作数和操作符。然后通过遍历中缀表达式,当遇到非操作符时直接压入栈,遇到操作符时将其与栈顶的操作符比较优先级,如果当前操作符优先级较高,则逐个弹出栈顶操作符直到找到合适的位置。最后,剩余的操作符和未弹尽的操作数依次压回栈。
注意,这个示例仅适用于加减乘除这四个基本算术运算,并且假设了所有的操作符都已知其优先级。实际应用中,你可能需要处理更复杂的情况,例如括号、函数等。运行此程序会得到相应的前缀表达式结果。
阅读全文