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

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

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

Помогите пожалуйста перевести код из Turbo Pascal в Си Ссылка на тему из заданием и обсуждением кода: Написать нерекурсивную функцию вычисления выражения, используя стек Код на Turbo Pascal:
Листинг программы
  1. type TStack = ^Stack;
  2. Stack = record
  3. x: longint;
  4. next: TStack
  5. end;
  6. procedure cr(s: string; var x: longint);
  7. begin
  8. repeat
  9. write(s, ' >= 0; ', s, ' = ');
  10. readln(x)
  11. until x >= 0
  12. end;
  13. procedure push(var st: TStack; t: longint);
  14. var tmp: TStack;
  15. begin
  16. new(tmp);
  17. tmp^.x := t;
  18. tmp^.next := st;
  19. st := tmp
  20. end;
  21. procedure pop(var st:TStack; var t: longint);
  22. var tmp: TStack;
  23. begin
  24. t := st^.x;
  25. tmp := st;
  26. st := st^.next;
  27. dispose(tmp)
  28. end;
  29. var m, n: longint;
  30. st: TStack;
  31. begin
  32. cr('m', m);
  33. cr('n', n);
  34. push(st, m);
  35. while st <> nil do
  36. begin
  37. pop(st, m);
  38. if (m = 0) or (n = 0)
  39. then n := m + n + 1
  40. else begin
  41. push(st, m-1);
  42. push(st, m);
  43. dec(n)
  44. end;
  45. end;
  46. writeln('f(m, n) = ', n);
  47. readln
  48. end.
Мои наработки перевода в Си(не знаю как написать функции и процедуры):
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Stack {
  4. int x;
  5. struct Stack *next;
  6. } Stack;
  7. typedef Stack* TStack;
  8. void cr(char *s, int *x)
  9. {
  10. //...
  11. }
  12. void push(TStack *st, int t)
  13. {
  14. //...
  15. }
  16. void pop(TStack *st, int *t)
  17. {
  18. //...
  19. }
  20. int main(void)
  21. {
  22. int m, n;
  23. TStack st = NULL;
  24. //...
  25. printf("f(m, n) = %d\n", n);
  26. return 0;

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct Stack
  5. {
  6.     int x;
  7.     struct Stack *next;
  8. } Stack, *TStack;
  9.  
  10.  
  11. void cr(char *s, int *x)
  12. {
  13.     do
  14.     {
  15.         printf("%s >= 0; %s = ", s, s);
  16.         scanf("%d", x);
  17.     }
  18.     while(x < 0);
  19. }
  20.  
  21. void push(TStack *st, int value)
  22. {
  23.     TStack t = (TStack)malloc(sizeof(Stack));
  24.     t->x = value;
  25.     t->next = *st;
  26.     *st = t;
  27. }
  28.  
  29. void pop(TStack *st, int *value)
  30. {
  31.     *value = (*st)->x;
  32.     TStack t = *st;
  33.     *st = (*st)->next;
  34.     free(t);
  35. }
  36.  
  37.  
  38. int main()
  39. {
  40.  
  41.     int m, n;
  42.     TStack st = NULL;
  43.  
  44.     cr("m", &m);
  45.     cr("n", &n);
  46.     push(&st, m);
  47.     while(st)
  48.     {
  49.         pop(&st, &m);
  50.         if(!m || !n) n = m + n + 1;
  51.         else
  52.         {
  53.             push(&st, m-1);
  54.             push(&st, m);
  55.             n -= 1;
  56.         }
  57.     }
  58.     printf("f(m, n) = %d", n);
  59.     getch();
  60. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы