中序式转后序式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* stack) {
stack->top = -1;
}
// 判断栈是否为空
int isEmpty(Stack* stack) {
return stack->top == -1;
}
// 判断栈是否已满
int isFull(Stack* stack) {
return stack->top == MAX_SIZE - 1;
}
// 入栈
void push(Stack* stack, char c) {
if (isFull(stack)) {
printf("Stack is full.\n");
return;
}
stack->data[++stack->top] = c;
}
// 出栈
char pop(Stack* stack) {
if (isEmpty(stack)) {
printf("Stack is empty.\n");
return '\0';
}
return stack->data[stack->top--];
}
// 获取栈顶元素
char peek(Stack* stack) {
if (isEmpty(stack)) {
printf("Stack is empty.\n");
return '\0';
}
return stack->data[stack->top];
}
// 判断运算符的优先级
int getPriority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
default:
return 0;
}
}
// 将中序表达式转换为后序表达式
void infixToPostfix(char* infix, char* postfix) {
Stack stack;
initStack(&stack);
int infixLen = strlen(infix);
int postfixIndex = 0;
for (int i = 0; i < infixLen; i++) {
char c = infix[i];
// 如果是操作数,直接输出到后序表达式中
if (c >= '0' && c <= '9') {
postfix[postfixIndex++] = c;
}
// 如果是左括号,入栈
else if (c == '(') {
push(&stack, c);
}
// 如果是右括号,将栈中的操作符依次出栈并输出到后序表达式中,直到遇到左括号
else if (c == ')') {
while (!isEmpty(&stack) && peek(&stack) != '(') {
postfix[postfixIndex++] = pop(&stack);
}
// 弹出左括号
if (!isEmpty(&stack) && peek(&stack) == '(') {
pop(&stack);
}
}
// 如果是运算符
else {
// 当栈非空且栈顶元素的优先级大于等于当前运算符时,将栈顶元素出栈并输出到后序表达式中
while (!isEmpty(&stack) && getPriority(peek(&stack)) >= getPriority(c)) {
postfix[postfixIndex++] = pop(&stack);
}
// 当前运算符入栈
push(&stack, c);
}
}
// 将栈中剩余的操作符出栈并输出到后序表达式中
while (!isEmpty(&stack)) {
postfix[postfixIndex++] = pop(&stack);
}
// 添加字符串结束符
postfix[postfixIndex] = '\0';
}
int main() {
char infix[MAX_SIZE];
printf("Enter an infix expression: ");
fgets(infix, MAX_SIZE, stdin);
infix[strlen(infix) - 1] = '\0'; // 移除换行符
char postfix[MAX_SIZE];
infixToPostfix(infix, postfix);
printf("Postfix expression: %s\n", postfix);
return 0;
}
使用示例:
Enter an infix expression: (1+2)*3-4/5
Postfix expression: 12+3*45/-
这段代码使用了一个栈数据结构来存储运算符,并按照运算符的优先级将中序表达式转换为后序表达式
原文地址: https://www.cveoy.top/t/topic/hBNK 著作权归作者所有。请勿转载和采集!