Написать нерекурсивную функцию вычисления выражения, используя стек - 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();
- }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем структуру для работы со стеком
- Создаём функцию для проверки ввода и сохранения значения в переменную
- Создаём функцию для добавления элемента в стек
- Создаём функцию для удаления элемента из стека
- Создаём основную функцию программы
- Вводим значения m и n с помощью функции cr
- Создаём пустой стек
- Добавляем первый элемент в стек (значение m)
- Входим в цикл, пока стек не станет пустым
- Извлекаем из стека последний добавленный элемент (m)
- Проверяем условие: если m или n равно нулю, то присваиваем n значение (m+1)+n и переходим к следующему шагу
- Если условие не выполнено, то добавляем в стек (m-1) и m, а затем уменьшаем значение n на единицу
- Повторяем шаги 10-13 до тех пор, пока стек не станет пустым
- Выводим значение n
- Ждём нажатия клавиши для выхода из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д