用c语言实现中缀表达式转换为后缀表达式
时间: 2023-05-27 20:02:27 浏览: 177
我是一名AI语言模型,可以为您提供算法思路及代码示例。中缀表达式转换为后缀表达式可以通过栈来实现。以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define MAX_STACK_SIZE 100 // 栈的最大容量
// 定义栈结构体
typedef struct {
char data[MAX_STACK_SIZE];
int top;
} Stack;
// 初始化栈
void initStack(Stack *s) {
s->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack *s) {
return s->top == -1;
}
// 判断栈是否已满
int isFull(Stack *s) {
return s->top == MAX_STACK_SIZE - 1;
}
// 入栈
void push(Stack *s, char elem) {
if (isFull(s)) {
printf("Stack Overflow!\n");
exit(1);
}
s->data[++s->top] = elem;
}
// 出栈
char pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack Underflow!\n");
exit(1);
}
return s->data[s->top--];
}
// 取栈顶元素
char peek(Stack *s) {
if (isEmpty(s)) {
printf("Stack Underflow!\n");
exit(1);
}
return s->data[s->top];
}
// 判断操作符的优先级
int priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 中缀表达式转后缀表达式
void infixToPostfix(char *infix, char *postfix) {
Stack s;
char c, op;
int i, j;
initStack(&s);
j = 0;
for (i = 0; infix[i] != '\0'; i++) {
c = infix[i];
if (isdigit(c)) { // 如果是数字,直接拼接到后缀表达式中
postfix[j++] = c;
} else if (c == '(') { // 如果是左括号,入栈
push(&s, c);
} else if (c == ')') { // 如果是右括号,弹出栈中左括号前的所有操作符并拼接到后缀表达式中
while ((op = pop(&s)) != '(') {
postfix[j++] = op;
}
} else if (c == '+' || c == '-' || c == '*' || c == '/') { // 如果是操作符
while (!isEmpty(&s) && priority(peek(&s)) >= priority(c)) {
// 弹出栈中优先级大于等于c的所有操作符并拼接到后缀表达式中
postfix[j++] = pop(&s);
}
push(&s, c); // 将c入栈
}
}
// 将栈中剩余操作符弹出并拼接到后缀表达式中
while (!isEmpty(&s)) {
postfix[j++] = pop(&s);
}
postfix[j] = '\0'; // 将后缀表达式的最后一个字符设置为'\0'
}
int main() {
char infix[] = "1+(2-3)*4+5";
char postfix[MAX_STACK_SIZE];
infixToPostfix(infix, postfix);
printf("Infix: %s\n", infix);
printf("Postfix: %s\n", postfix);
return 0;
}
```
运行结果:
```
Infix: 1+(2-3)*4+5
Postfix: 123-4*+5+
```
阅读全文