Перевести код с 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 +
и выводим результат на экран.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д