Написать нерекурсивную функцию вычисления выражения, используя стек - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста перевести код из Turbo Pascal в Си Ссылка на тему из заданием и обсуждением кода: Написать нерекурсивную функцию вычисления выражения, используя стек Код на Turbo Pascal:
type TStack = ^Stack;
     Stack = record
               x: longint;
               next: TStack
             end;
 
procedure cr(s: string; var x: longint);
begin
  repeat
    write(s, ' >= 0;  ', s, ' = ');
    readln(x)
  until x >= 0
end;
 
procedure push(var st: TStack; t: longint);
var tmp: TStack;
begin
  new(tmp);
  tmp^.x := t;
  tmp^.next := st;
  st := tmp
end;
 
procedure pop(var st:TStack; var t: longint);
var tmp: TStack;
begin
  t := st^.x;
  tmp := st;
  st := st^.next;
  dispose(tmp)
end;
 
var m, n: longint;
    st: TStack;
 
begin
  cr('m', m);
  cr('n', n);
  push(st, m);
  while st <> nil do
    begin
      pop(st, m);
      if (m = 0) or (n = 0)
        then n := m + n + 1
        else begin
          push(st, m-1);
          push(st, m);
          dec(n)
        end;
    end;
  writeln('f(m, n) = ', n);
  readln
end.
Мои наработки перевода в Си(не знаю как написать функции и процедуры):
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Stack {
    int x;
    struct Stack *next;
} Stack;
typedef Stack* TStack;
 
void cr(char *s, int *x)
{
    //...
}
 
void push(TStack *st, int t)
{
    //...
}
 
void pop(TStack *st, int *t)
{
    //...
}
 
int main(void)
{
    int m, n;
    TStack st = NULL;
    //...
    printf("f(m, n) = %d\n", n);
    return 0;

Решение задачи: «Написать нерекурсивную функцию вычисления выражения, используя стек»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
 
typedef struct Stack
{
    int x;
    struct Stack *next;
} Stack, *TStack;
 
 
void cr(char *s, int *x)
{
    do
    {
        printf("%s >= 0; %s = ", s, s);
        scanf("%d", x);
    }
    while(x < 0);
}
 
void push(TStack *st, int value)
{
    TStack t = (TStack)malloc(sizeof(Stack));
    t->x = value;
    t->next = *st;
    *st = t;
}
 
void pop(TStack *st, int *value)
{
    *value = (*st)->x;
    TStack t = *st;
    *st = (*st)->next;
    free(t);
}
 
 
int main()
{
 
    int m, n;
    TStack st = NULL;
 
    cr("m", &m);
    cr("n", &n);
    push(&st, m);
    while(st)
    {
        pop(&st, &m);
        if(!m || !n) n = m + n + 1;
        else
        {
            push(&st, m-1);
            push(&st, m);
            n -= 1;
        }
    }
    printf("f(m, n) = %d", n);
    getch();
}

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

  1. Включаем необходимые заголовочные файлы
  2. Определяем структуру для работы со стеком
  3. Создаём функцию для проверки ввода и сохранения значения в переменную
  4. Создаём функцию для добавления элемента в стек
  5. Создаём функцию для удаления элемента из стека
  6. Создаём основную функцию программы
  7. Вводим значения m и n с помощью функции cr
  8. Создаём пустой стек
  9. Добавляем первый элемент в стек (значение m)
  10. Входим в цикл, пока стек не станет пустым
  11. Извлекаем из стека последний добавленный элемент (m)
  12. Проверяем условие: если m или n равно нулю, то присваиваем n значение (m+1)+n и переходим к следующему шагу
  13. Если условие не выполнено, то добавляем в стек (m-1) и m, а затем уменьшаем значение n на единицу
  14. Повторяем шаги 10-13 до тех пор, пока стек не станет пустым
  15. Выводим значение n
  16. Ждём нажатия клавиши для выхода из программы

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


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

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

13   голосов , оценка 3.846 из 5
Похожие ответы