Перевести код с 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;
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы: , , ,
  2. Объявляем функцию eval, которая принимает строку с выражением в качестве аргумента и возвращает результат вычисления.
  3. Определяем структуру stack, которая содержит массив данных типа int и указатель на массив, а также переменные count и size, которые отслеживают количество элементов в стеке и его текущий размер.
  4. Создаем typedef для структуры stack.
  5. Реализуем функцию stack_push, которая добавляет элемент в стек. Если стек переполнен, то увеличиваем его размер и выделяем новый массив.
  6. Реализуем функцию stack_pop, которая извлекает элемент из стека.
  7. В функции eval создаем экземпляр стека, инициализируем его нулевыми значениями.
  8. Проходим по каждому символу входной строки.
  9. Если символ является цифрой, то считываем его и умножаем на 10 в соответствии с его позицией в числе (сдвиг вправо на количество цифр, отведённых под десятичную часть).
  10. Если символ не является цифрой, то проверяем, является ли он пробелом. Если нет, то извлекаем два последних элемента из стека и выполняем операции в соответствии с текущим символом.
  11. Добавляем результат операции в стек.
  12. После прохождения всей строки извлекаем последний элемент из стека и возвращаем его как результат работы функции eval.
  13. Освобождаем память, выделенную под массив данных стека.
  14. В функции main вызываем eval с аргументом 2 2 + и выводим результат на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 3.8 из 5