Программирование для Linux. Профессиональный подход
Шрифт:
Stack* stack) {
number operand1, operand2;
if (empty_stack(*stack))
return 0;
operand2 = pop_stack(stack);
if (empty_stack(*stack))
return 0;
operand1 = pop_stack(stack);
push_stack(stack, (*function)(operand1, operand2));
destroy_number(operand1);
destroy_number(operand2);
return 1;
}
/* Эта функция выполняет указанную унарную операцию над
операндом, извлекаемым из стека, помещая результат
обратно в стек. В случае успеха возвращается
ненулевое значение. */
int apply_unary_function(number (*function)(number), Stack* stack) {
number operand;
if (empty_stack(*stack))
return 0;
operand = pop_stack(stack);
push_stack(stack, (*function)(operand));
destroy_number(operand);
return 1;
}
int main {
char command_line[1000];
char* command_to_parse;
char* token;
Stack number_stack = create_stack;
while (1) {
printf("Please enter a postfix expression:\n");
command_to_parse =
fgets(command_line, sizeof (command_line), stdin);
if (command_to_parse = NULL)
return 0;
token = strtok(command_to_parse, " \t\n");
command_to_parse = 0;
while (token != 0) {
if (isdigit(token[0]))
push_stack(&number_stack, string_to_number(token));
else if (((strcmp(token, "+ ") == 0) &&
!apply_binary_function(&add, &number_stack)) ||
((strcmp(token, "-") == 0) &&
!apply_binary_function(&subtract, &number_stack)) ||
((strcmp(token, "*") == 0) &&
!apply_binary_function(&product, &number_stack)) ||
((strcmp(token, "even") == 0) &&
!apply_unary_function(&even, &number_stack)) ||
((strcmp(token, "odd") == 0) &&
!apply_unary_function(&odd, &number_stack)))
return 1;
token = strtok(command_to_parse, " \t\n");
}
if (empty_stack(number_stack))
return 1;
else {
number answer = pop_stack(number_stack);
printf("%u\n", number_to_unsigned_int(answer));
destroy_number(answer);
clear_stack(&number_stack);
}
}
return 0;
}
Функции, приведенные в листинге А.4 выполняют операции над унарными числами, представленными в виде связных списков.
Листинг А.4. (number.c) Арифметика унарных чисел
/* Операции над унарными числами */
#include <assert.h>
#include <stdlib.h>
#include <limits.h>
#include "definitions.h"
/* Создание числа, равного нулю. */
number make_zero {
return 0;
}
/* Эта функция возвращает ненулевое значение,
если аргумент равен нулю. */
int zerop(number n) {
return n == 0;
}
/* Уменьшение числа на единицу. */
number decrement_number(number n) {
number answer;
assert(!zerop(n));
answer = n->one_less_;
free(n);
return answer;
}
/* Добавление единицы к числу. */
number add_one(number n) {
number answer = malloc(sizeof(struct LinkedListNumber));
answer->one_less_ = n;
return answer;
}
/* Удаление числа. */
void destroy_number(number n) {
while (!zerop(n))
n = decrement_number(n);
}
/* Копирование числа. Эта функция необходима для того,
чтобы при временных вычислениях не искажались
Поделиться:
Популярные книги
Черта прикрытия
9. Культура
Фантастика:
боевая фантастика
космическая фантастика
киберпанк
6.67
рейтинг книги
Звездная Кровь. Экзарх III
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Железное пламя
Фантастика:
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 5
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Древесный маг Орловского княжества 3
3. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Второгодка. Книга 3. Ученье свет
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.00
рейтинг книги
Тринадцатый IV
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Ермак. Телохранитель
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Французская новелла XX века. 1900–1939
Проза:
классическая проза
6.25
рейтинг книги
Рядовой. Назад в СССР. Книга 1
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кодекс Императора II
2. Кодекс Императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Моров. Том 1 и Том 2
1. Моров
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Хозяин Теней 7
7. Безбожник
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Элизиум. Аликс и монеты
1. Элизиум
Фантастика:
фэнтези
сказочная фантастика
8.98