写注释#include stdioh#include stdlibh#define MAX_SIZE 100typedef struct char dataMAX_SIZE; int top; Stack;void initStackStack s s-top = -1;int isEmptyStack s return s-top == -1;int isFullS
#include <stdio.h> #include <stdlib.h>
#define MAX_SIZE 100
typedef struct { char data[MAX_SIZE]; int top; } Stack; // 定义结构体类型Stack,包含一个字符数组和一个整数
void initStack(Stack *s) { s->top = -1; // 初始化栈的顶部指针为-1,表示栈为空 }
int isEmpty(Stack *s) { return s->top == -1; // 如果栈的顶部指针为-1,表示栈为空,返回1,否则返回0 }
int isFull(Stack *s) { return s->top == MAX_SIZE - 1; // 如果栈的顶部指针等于最大容量减1,表示栈已满,返回1,否则返回0 }
void push(Stack *s, char c) { if (isFull(s)) { printf("Stack is full\n"); exit(1); // 如果栈已满,打印提示信息并退出程序 } s->data[++s->top] = c; // 将字符c压入栈中,栈顶指针加1 }
char pop(Stack *s) { if (isEmpty(s)) { printf("Stack is empty\n"); exit(1); // 如果栈为空,打印提示信息并退出程序 } return s->data[s->top--]; // 将栈顶元素弹出并返回,栈顶指针减1 }
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 == '/' || c == '(' || c == ')'; // 判断字符c是否为运算符,是则返回1,否则返回0 }
int getPriority(char c) { if (c == '*' || c == '/') { return 2; // 返回运算符c的优先级,乘法和除法优先级最高,返回2 } else if (c == '+' || c == '-') { return 1; // 加法和减法优先级次高,返回1 } return 0; // 其他字符优先级最低,返回0 }
void infixToPostfix(char *infix, char *postfix) { Stack s; // 定义一个栈s initStack(&s); // 初始化栈s int i = 0, j = 0; // 定义两个整数变量i和j,分别表示infix和postfix的索引
while (infix[i] != '#') { // 当infix的当前字符不为#时,循环执行以下步骤
if (!isOperator(infix[i])) { // 如果当前字符不是运算符
postfix[j++] = infix[i++]; // 将当前字符添加到postfix中,然后i和j分别加1
} else if (infix[i] == '(') { // 如果当前字符是左括号
push(&s, infix[i++]); // 将左括号压入栈s,然后i加1
} else if (infix[i] == ')') { // 如果当前字符是右括号
while (!isEmpty(&s) && peek(&s) != '(') { // 循环执行以下步骤直到栈s为空或栈顶元素为左括号
postfix[j++] = pop(&s); // 将栈顶元素弹出并添加到postfix中,然后j加1
}
if (!isEmpty(&s) && peek(&s) != '(') { // 如果栈s不为空且栈顶元素不为左括号
printf("Invalid expression\n");
exit(1); // 打印提示信息并退出程序
} else {
pop(&s); // 弹出左括号
}
i++; // i加1
} else { // 如果当前字符是运算符
while (!isEmpty(&s) && getPriority(infix[i]) <= getPriority(peek(&s))) { // 循环执行以下步骤直到栈s为空或当前运算符的优先级大于栈顶元素的优先级
postfix[j++] = pop(&s); // 将栈顶元素弹出并添加到postfix中,然后j加1
}
push(&s, infix[i++]); // 将当前运算符压入栈s,然后i加1
}
}
while (!isEmpty(&s)) { // 当栈s不为空时,循环执行以下步骤
postfix[j++] = pop(&s); // 将栈顶元素弹出并添加到postfix中,然后j加1
}
postfix[j] = '\0'; // 在postfix的末尾添加字符串结束符
}
int main() { char infix[MAX_SIZE]; // 定义一个字符数组infix,用于存储中缀表达式 char postfix[MAX_SIZE]; // 定义一个字符数组postfix,用于存储后缀表达式 scanf("%s", infix); // 从标准输入中读取一个字符串并存储到infix中 infixToPostfix(infix, postfix); // 将中缀表达式转换为后缀表达式 printf("%s\n", postfix); // 打印后缀表达式 return 0; }
原文地址: https://www.cveoy.top/t/topic/jfjK 著作权归作者所有。请勿转载和采集!