Чтение онлайн

на главную - закладки

Жанры

Программирование для 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);

}

/* Копирование числа. Эта функция необходима для того,

чтобы при временных вычислениях не искажались

Поделиться:
Популярные книги

И в аду есть герои

Панов Вадим Юрьевич
5. Тайный Город
Фантастика:
боевая фантастика
9.19
рейтинг книги
И в аду есть герои

Эволюционер из трущоб. Том 3

Панарин Антон
3. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
6.00
рейтинг книги
Эволюционер из трущоб. Том 3

Мы друг друга не выбирали

Кистяева Марина
1. Мы выбираем...
Любовные романы:
остросюжетные любовные романы
прочие любовные романы
современные любовные романы
5.00
рейтинг книги
Мы друг друга не выбирали

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Оживший камень

Кас Маркус
1. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Оживший камень

Заботы Элли Рэйт

Ром Полина
Фантастика:
попаданцы
фэнтези
6.25
рейтинг книги
Заботы Элли Рэйт

Несгибаемый граф. Тетралогия

Яманов Александр
Нет пророка в своем отечестве
Фантастика:
альтернативная история
фэнтези
5.00
рейтинг книги
Несгибаемый граф. Тетралогия

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Запасная дочь

Зика Натаэль
Фантастика:
фэнтези
6.40
рейтинг книги
Запасная дочь

Я не князь. Книга XIII

Дрейк Сириус
13. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я не князь. Книга XIII

Дважды одаренный. Том III

Тарс Элиан
3. Дважды одаренный
Фантастика:
альтернативная история
аниме
фэнтези
фантастика: прочее
юмористическое фэнтези
5.00
рейтинг книги
Дважды одаренный. Том III

Лекарь Империи

Карелин Сергей Витальевич
1. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи

Барон. Книга вторая

Первухин Андрей Евгеньевич
6. Ученик
Фантастика:
фэнтези
попаданцы
5.40
рейтинг книги
Барон. Книга вторая

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5