用c++来实现 4、输入一个中缀表达式,表达式包含有+、-、*、/、括号和数字字符,把中缀表达式转换成后缀表达式。
时间: 2023-10-20 08:10:05 浏览: 191
要实现中缀表达式转后缀表达式,我们可以使用栈来存储运算符,并按照优先级顺序将运算符弹出。以下是用 C 语言实现的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MAX_SIZE 100
typedef struct {
char data[MAX_SIZE];
int top;
} Stack;
void init(Stack *s) {
s->top = -1;
}
void push(Stack *s, char c) {
if (s->top == MAX_SIZE - 1) {
printf("Stack overflow\n");
exit(1);
}
s->data[++s->top] = c;
}
char pop(Stack *s) {
if (s->top == -1) {
printf("Stack underflow\n");
exit(1);
}
return s->data[s->top--];
}
char peek(Stack *s) {
if (s->top == -1) {
printf("Stack empty\n");
exit(1);
}
return s->data[s->top];
}
int is_operator(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 infix_to_postfix(char *infix, char *postfix) {
int i, j;
Stack s;
init(&s);
for (i = 0, j = 0; infix[i] != '\0'; i++) {
if (isdigit(infix[i])) {
postfix[j++] = infix[i];
} else if (is_operator(infix[i])) {
while (s.top != -1 && is_operator(peek(&s)) && precedence(infix[i]) <= precedence(peek(&s))) {
postfix[j++] = pop(&s);
}
push(&s, infix[i]);
} else if (infix[i] == '(') {
push(&s, infix[i]);
} else if (infix[i] == ')') {
while (s.top != -1 && peek(&s) != '(') {
postfix[j++] = pop(&s);
}
if (s.top == -1) {
printf("Mismatched parentheses\n");
exit(1);
}
pop(&s);
}
}
while (s.top != -1) {
if (peek(&s) == '(') {
printf("Mismatched parentheses\n");
exit(1);
}
postfix[j++] = pop(&s);
}
postfix[j] = '\0';
}
int main() {
char infix[MAX_SIZE], postfix[MAX_SIZE];
printf("Enter an infix expression:\n");
scanf("%s", infix);
infix_to_postfix(infix, postfix);
printf("The postfix expression is:\n%s\n", postfix);
return 0;
}
```
这个程序中,我们定义了一个 `Stack` 结构体来实现栈。`init()` 函数用于初始化栈,`push()` 函数用于将元素压入栈中,`pop()` 函数用于从栈中弹出元素,`peek()` 函数用于获取栈顶元素。`is_operator()` 函数用于判断一个字符是否为运算符,`precedence()` 函数用于获取运算符的优先级。`infix_to_postfix()` 函数用于将中缀表达式转换为后缀表达式,其中我们使用了上述的栈操作。最后,我们在 `main()` 函数中调用 `infix_to_postfix()` 函数来实现中缀表达式转后缀表达式。
阅读全文