C语言:中缀转后缀
时间: 2023-10-29 13:19:23 浏览: 95
中缀表达式转后缀表达式可以通过使用栈来实现。具体步骤如下:
1. 创建一个空栈和一个空的输出队列;
2. 从左到右遍历中缀表达式的每个元素;
3. 如果当前元素是操作数,将其加入输出队列中;
4. 如果当前元素是左括号,将其压入栈中;
5. 如果当前元素是右括号,则将栈中的元素弹出并加入输出队列中,直到遇到左括号,左括号弹出但不加入输出队列;
6. 如果当前元素是运算符:
1. 如果栈为空,则将当前运算符压入栈中;
2. 如果栈不为空,则比较当前运算符与栈顶运算符的优先级,如果当前运算符优先级低于等于栈顶运算符,则将栈顶运算符弹出并加入输出队列中,重复此步骤直到当前运算符优先级高于栈顶运算符,然后将当前运算符压入栈中;
7. 遍历完中缀表达式后,如果栈中还有运算符,将它们依次弹出并加入输出队列中;
8. 输出队列中的元素即为转换后的后缀表达式。
下面是一个 C 语言实现的中缀转后缀的函数,其中假定中缀表达式已经存储在一个字符串数组 infix 中,后缀表达式存储在另一个字符串数组 postfix 中:
```c
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXLEN 100
int is_operator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
int get_priority(char c) {
if (c == '*' || c == '/') {
return 2;
} else if (c == '+' || c == '-') {
return 1;
} else {
return 0;
}
}
void infix_to_postfix(char *infix, char *postfix) {
int i, j, len;
char c, stack[MAXLEN];
int top = -1;
len = strlen(infix);
j = 0;
for (i = 0; i < len; i++) {
c = infix[i];
if (isdigit(c)) {
postfix[j++] = c;
} else if (is_operator(c)) {
while (top >= 0 && get_priority(stack[top]) >= get_priority(c)) {
postfix[j++] = stack[top--];
}
stack[++top] = c;
} else if (c == '(') {
stack[++top] = c;
} else if (c == ')') {
while (top >= 0 && stack[top] != '(') {
postfix[j++] = stack[top--];
}
if (top >= 0 && stack[top] == '(') {
top--;
}
}
}
while (top >= 0) {
postfix[j++] = stack[top--];
}
postfix[j] = '\0';
}
int main() {
char infix[MAXLEN], postfix[MAXLEN];
printf("Enter an infix expression: ");
fgets(infix, MAXLEN, stdin);
infix_to_postfix(infix, postfix);
printf("Postfix expression: %s\n", postfix);
return 0;
}
```
阅读全文