Написать нерекурсивную функцию вычисления выражения, используя стек - 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
- Ждём нажатия клавиши для выхода из программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д