中缀表达式转换成后缀表达式,支持多位数以及负数的运算,使用C语言实现,每一句都加上注释
时间: 2024-05-07 13:20:30 浏览: 136
中缀表达式转后缀表达式主要使用栈来实现,具体步骤如下:
1. 初始化两个栈,一个用于存储操作符,一个用于存储后缀表达式;
2. 从左到右遍历中缀表达式的每个元素,如果是数字,则直接存储到后缀表达式栈中;
3. 如果是左括号,则将其压入操作符栈中;
4. 如果是右括号,则取出操作符栈中的元素,直到遇到左括号,将这些操作符存储到后缀表达式栈中;
5. 如果是操作符,则与操作符栈顶元素进行比较,如果优先级高于栈顶元素,则将其压入操作符栈中;否则取出操作符栈中的元素,存储到后缀表达式栈中,直到遇到优先级小于等于当前操作符的操作符为止;
6. 遍历完中缀表达式后,将操作符栈中的元素全部取出,存储到后缀表达式栈中;
7. 后缀表达式栈中的元素就是转换后的后缀表达式。
代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_SIZE 100
typedef struct {
int top;
char data[MAX_SIZE];
} Stack;
void init_stack(Stack *stack) {
stack->top = -1;
}
int is_empty(Stack *stack) {
return stack->top == -1;
}
int is_full(Stack *stack) {
return stack->top == MAX_SIZE - 1;
}
void push(Stack *stack, char ch) {
if (is_full(stack)) {
printf("Stack is full.\n");
exit(-1);
}
stack->data[++stack->top] = ch;
}
char pop(Stack *stack) {
if (is_empty(stack)) {
printf("Stack is empty.\n");
exit(-1);
}
return stack->data[stack->top--];
}
char get_top(Stack *stack) {
if (is_empty(stack)) {
printf("Stack is empty.\n");
exit(-1);
}
return stack->data[stack->top];
}
int priority(char ch) {
switch (ch) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
default:
return -1;
}
}
void infix_to_postfix(char *infix, char *postfix) {
Stack op_stack;
init_stack(&op_stack);
int i, j;
char ch;
for (i = 0, j = 0; infix[i] != '\0'; i++) {
if (isdigit(infix[i]) || infix[i] == '-') { // 处理数字
postfix[j++] = infix[i];
while (isdigit(infix[i + 1])) { // 处理多位数字
postfix[j++] = infix[++i];
}
postfix[j++] = ' '; // 数字之间用空格分隔
} else if (infix[i] == '(') { // 左括号入栈
push(&op_stack, infix[i]);
} else if (infix[i] == ')') { // 右括号弹出操作符
while ((ch = pop(&op_stack)) != '(') {
postfix[j++] = ch;
postfix[j++] = ' ';
}
} else if (strchr("+-*/", infix[i]) != NULL) { // 处理操作符
while (!is_empty(&op_stack) && priority(infix[i]) <= priority(get_top(&op_stack))) {
postfix[j++] = pop(&op_stack);
postfix[j++] = ' ';
}
push(&op_stack, infix[i]);
}
}
while (!is_empty(&op_stack)) { // 弹出剩余操作符
postfix[j++] = pop(&op_stack);
postfix[j++] = ' ';
}
postfix[j] = '\0';
}
int main() {
char infix[MAX_SIZE], postfix[MAX_SIZE];
printf("Enter an infix expression: ");
fgets(infix, MAX_SIZE, stdin);
infix_to_postfix(infix, postfix);
printf("The postfix expression is: %s\n", postfix);
return 0;
}
```
其中 priority 函数用来判断操作符的优先级,isdigit 函数用来判断字符是否是数字,strchr 函数用来判断字符是否是操作符。这个实现还支持多位数以及负数的运算,例如输入 -5+3*2,输出的后缀表达式为 5 - 3 2 * + 。
阅读全文