Конечно! Преобразование арифметического выражения из инфиксной формы (где операторы находятся между операндами) в постфиксную форму (где операторы располагаются после операндов) можно осуществить с помощью алгоритма, известного как алгоритм Шунта. Для этой задачи мы будем использовать стек.
Вот пример программы на языке C, которая выполняет это преобразование:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX 100
char stack[MAX];
int top = -1;
void push(char ch) {
if (top < MAX - 1) {
stack[++top] = ch;
}
}
char pop() {
if (top >= 0) {
return stack[top--];
}
return '\0';
}
char peek() {
if (top >= 0) {
return stack[top];
}
return '\0';
}
int precedence(char ch) {
switch (ch) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
case '^':
return 3;
}
return 0;
}
int is_operator(char ch) {
return ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '^';
}
void infix_to_postfix(char* infix, char* postfix) {
int i = 0, j = 0;
while (infix[i] != '\0') {
if (isalnum(infix[i])) {
postfix[j++] = infix[i];
} else if (infix[i] == '(') {
push(infix[i]);
} else if (infix[i] == ')') {
while (top != -1 && peek() != '(') {
postfix[j++] = pop();
}
pop(); // Удаляем '(' из стека
} else if (is_operator(infix[i])) {
while (top != -1 && precedence(peek()) >= precedence(infix[i])) {
postfix[j++] = pop();
}
push(infix[i]);
}
i++;
}
while (top != -1) {
postfix[j++] = pop();
}
postfix[j] = '\0'; // Завершаем строку
}
int main() {
char infix[MAX], postfix[MAX];
printf("Введите инфиксное выражение: ");
fgets(infix, sizeof(infix), stdin);
infix[strcspn(infix, "\n")] = 0; // Удаляем символ новой строки
infix_to_postfix(infix, postfix);
printf("Постфиксное выражение: %s\n", postfix);
return 0;
}
Объяснение кода:
- Стек: Для реализации используется массив
stackи переменнаяtop, которая отслеживает верхушку стека. - Функции:
push()добавляет элемент в стек.pop()удаляет элемент с верхушки стека.peek()возвращает верхний элемент стакана, не удаляя его.precedence()определяет приоритет операторов.is_operator()проверяет, является ли символ оператором.
- Преобразование: Функция
infix_to_postfix()принимает инфиксное выражение и формирует соответствующее постфиксное выражение. - Основная функция: В
main()программа принимает инфиксное выражение от пользователя, вызывает функцию преобразования и выводит постфиксное выражение.
Эта программа поможет вам понять, как использовать стек для преобразования выражений. Если у вас есть вопросы или нужны дополнительные объяснения, не стесняйтесь спрашивать!
