Перевести код с 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/Си - C (СИ)»

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;
}

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


СОХРАНИТЬ ССЫЛКУ