Перевести код с Python на Pascal/Си - C (СИ)
Формулировка задачи:
from pythonds.basic.stack import Stack def postfixEval(postfixExpr): operandStack = Stack() tokenList = postfixExpr.split() for token in tokenList: if token in "0123456789": operandStack.push(int(token)) else: operand2 = operandStack.pop() operand1 = operandStack.pop() result = doMath(token,operand1,operand2) operandStack.push(result) return operandStack.pop() def doMath(op, op1, op2): if op == "*": return op1 * op2 elif op == "/": return op1 / op2 elif op == "+": return op1 + op2 else: return op1 - op2 print(postfixEval('7 8 + 3 2 + /'))
Решение задачи: «Перевести код с Python на Pascal/Си»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int eval(const char*); int main() { printf("%d\n", eval("2 2 +")); return 0; } struct stack { int *data; size_t size, count; }; typedef struct stack stack; void stack_push(stack* s, int v) { if(s->size == s->count) { s->size += 256; s->data = (int*)realloc(s->data, s->size*sizeof(int)); } s->data[s->count++] = v; } int stack_pop(stack* s) { return s->data[--(s->count)]; } int eval(const char* e) { stack s; int O, oO, Oo; s.count = s.size = 0; s.data = NULL; while('\0' != *e) { if(isdigit(*e)) { O = 0; do { O*=10; O+= *e - '0'; ++e; } while(isdigit(*e)); stack_push(&s, O); } else { if(!isspace(*e)) { O=0; oO = stack_pop(&s); Oo = stack_pop(&s); switch(*e) { case '-':O=oO-Oo;break; case '+':O=oO+Oo;break; case '/':O=oO/Oo;break; case '*':O=oO*Oo;break; } stack_push(&s, O); } ++e; } } O = stack_pop(&s); free(s.data); return O; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы:
, , , - Объявляем функцию eval, которая принимает строку с выражением в качестве аргумента и возвращает результат вычисления.
- Определяем структуру stack, которая содержит массив данных типа int и указатель на массив, а также переменные count и size, которые отслеживают количество элементов в стеке и его текущий размер.
- Создаем typedef для структуры stack.
- Реализуем функцию stack_push, которая добавляет элемент в стек. Если стек переполнен, то увеличиваем его размер и выделяем новый массив.
- Реализуем функцию stack_pop, которая извлекает элемент из стека.
- В функции eval создаем экземпляр стека, инициализируем его нулевыми значениями.
- Проходим по каждому символу входной строки.
- Если символ является цифрой, то считываем его и умножаем на 10 в соответствии с его позицией в числе (сдвиг вправо на количество цифр, отведённых под десятичную часть).
- Если символ не является цифрой, то проверяем, является ли он пробелом. Если нет, то извлекаем два последних элемента из стека и выполняем операции в соответствии с текущим символом.
- Добавляем результат операции в стек.
- После прохождения всей строки извлекаем последний элемент из стека и возвращаем его как результат работы функции eval.
- Освобождаем память, выделенную под массив данных стека.
- В функции main вызываем eval с аргументом
2 2 +
и выводим результат на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д