使用c语言写一个将输入的中缀表达式转换为后缀表达式。根据后缀表达式计算表达式的算法
时间: 2023-06-27 19:04:56 浏览: 114
C语言实现中缀表达式转换为后缀表达式
以下是将中缀表达式转换为后缀表达式的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100
typedef struct {
char data[MAX_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_SIZE - 1;
}
void push(Stack *s, char c) {
if (isFull(s)) {
printf("Stack is full\n");
exit(1);
}
s->data[++s->top] = c;
}
char pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty\n");
exit(1);
}
return s->data[s->top--];
}
char peek(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty\n");
exit(1);
}
return s->data[s->top];
}
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
int precedence(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
void infixToPostfix(char *infix, char *postfix) {
Stack s;
initStack(&s);
int i = 0, j = 0;
while (infix[i] != '\0') {
char c = infix[i];
if (c == '(') {
push(&s, c);
} else if (c == ')') {
while (peek(&s) != '(') {
postfix[j++] = pop(&s);
}
pop(&s);
} else if (isOperator(c)) {
while (!isEmpty(&s) && precedence(c) <= precedence(peek(&s))) {
postfix[j++] = pop(&s);
}
push(&s, c);
} else {
postfix[j++] = c;
}
i++;
}
while (!isEmpty(&s)) {
postfix[j++] = pop(&s);
}
postfix[j] = '\0';
}
int calculate(char *postfix) {
Stack s;
initStack(&s);
int i = 0;
while (postfix[i] != '\0') {
char c = postfix[i];
if (isdigit(c)) {
push(&s, c - '0');
} else {
int b = pop(&s);
int a = pop(&s);
switch (c) {
case '+':
push(&s, a + b);
break;
case '-':
push(&s, a - b);
break;
case '*':
push(&s, a * b);
break;
case '/':
push(&s, a / b);
break;
default:
printf("Invalid operator\n");
exit(1);
}
}
i++;
}
return pop(&s);
}
int main() {
char infix[MAX_SIZE];
char postfix[MAX_SIZE];
printf("Enter an infix expression: ");
scanf("%s", infix);
infixToPostfix(infix, postfix);
printf("Postfix expression: %s\n", postfix);
int result = calculate(postfix);
printf("Result: %d\n", result);
return 0;
}
```
该程序定义了一个结构体 `Stack`,用于表示栈,包含了栈的基本操作函数:`initStack`、`isEmpty`、`isFull`、`push`、`pop` 和 `peek`。另外,还定义了两个辅助函数 `isOperator` 和 `precedence`,用于判断字符是否为运算符和获取运算符的优先级。
`infixToPostfix` 函数用于将中缀表达式转换为后缀表达式。它使用一个栈来存储运算符,遍历中缀表达式的每个字符,根据字符的类型进行处理。如果是左括号,则直接入栈;如果是右括号,则弹出栈中的运算符,直到遇到左括号;如果是运算符,则弹出栈中优先级不小于该运算符的其他运算符,并将它们加入输出串中,然后将该运算符入栈;如果是数字或变量,则直接加入输出串中。最后,将栈中剩余的运算符弹出,加入输出串中。
`calculate` 函数用于计算后缀表达式的值。它同样使用一个栈来存储操作数,遍历后缀表达式的每个字符,如果是数字,则将它入栈;如果是运算符,则弹出栈顶的两个操作数,进行计算,并将结果入栈。最后,栈中剩余的元素即为表达式的值。
在 `main` 函数中,首先输入中缀表达式,然后调用 `infixToPostfix` 函数将其转换为后缀表达式,并输出后缀表达式。接着,调用 `calculate` 函数计算后缀表达式的值,并输出结果。
阅读全文