中缀表达式转换为后缀表达式(栈-链栈)(c语言)(头哥适用版)
时间: 2023-10-09 22:07:32 浏览: 106
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct Node {
char data;
struct Node *next;
} Node, *LinkStack;
// 初始化链栈
void initStack(LinkStack *s) {
*s = NULL;
}
// 判断栈是否为空
int isEmpty(LinkStack s) {
return s == NULL;
}
// 入栈
void push(LinkStack *s, char data) {
Node *node = (Node *) malloc(sizeof(Node));
node->data = data;
node->next = *s;
*s = node;
}
// 出栈
char pop(LinkStack *s) {
if (isEmpty(*s)) {
printf("Stack is empty!\n");
exit(-1);
}
char data = (*s)->data;
Node *temp = *s;
*s = (*s)->next;
free(temp);
return data;
}
// 获取栈顶元素
char getTop(LinkStack s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
exit(-1);
}
return s->data;
}
// 判断运算符优先级
int getPriority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '(':
return 0;
default:
printf("Invalid operator!\n");
exit(-1);
}
}
// 中缀表达式转换为后缀表达式
void infixToPostfix(char *infix, char *postfix) {
LinkStack s;
initStack(&s);
int i = 0, j = 0;
while (infix[i] != '\0') {
if (isdigit(infix[i])) { // 如果是数字,直接输出到后缀表达式中
postfix[j++] = infix[i++];
} else if (infix[i] == '(') { // 如果是左括号,入栈
push(&s, infix[i++]);
} else if (infix[i] == ')') { // 如果是右括号,弹出栈中左括号之前的运算符并输出到后缀表达式中
while (getTop(s) != '(') {
postfix[j++] = pop(&s);
}
pop(&s); // 弹出左括号
i++;
} else if (infix[i] == '+' || infix[i] == '-' || infix[i] == '*' || infix[i] == '/') { // 如果是运算符
if (isEmpty(s) || getPriority(infix[i]) > getPriority(getTop(s))) { // 如果栈为空或当前运算符的优先级大于栈顶运算符的优先级,入栈
push(&s, infix[i++]);
} else { // 弹出栈中优先级大于等于当前运算符的运算符并输出到后缀表达式中,然后把当前运算符入栈
postfix[j++] = pop(&s);
}
} else { // 如果是非法字符,输出错误信息并退出程序
printf("Invalid character!\n");
exit(-1);
}
}
while (!isEmpty(s)) { // 把栈中剩余的运算符依次弹出并输出到后缀表达式中
postfix[j++] = pop(&s);
}
postfix[j] = '\0'; // 加上字符串结束符
}
int main() {
char infix[50], postfix[50];
printf("请输入中缀表达式:");
gets(infix);
infixToPostfix(infix, postfix);
printf("后缀表达式为:%s\n", postfix);
return 0;
}
阅读全文