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