Перевести код с 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 +и выводим результат на экран.