Вход/Регистрация
Программирование для Linux. Профессиональный подход
вернуться

Самьюэл Алекс

Шрифт:

Вводимые числа должны быть неотрицательными

десятичными числами. Поддерживаются операторы

"+", "-" и "*". Унарные операторы "even" и "odd"

возвращают значение 1 в том случае, когда операнд

является четным или нечетным соответственно.

Лексемы разделяются пробелами. Отрицательные числа

не поддерживаются. */

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

#include "definitions.h"

/* Эта функция выполняет указанную бинарную операцию над

операндами, извлекаемыми из стека, помещая результат

обратно в стек, в случае успеха возвращается

ненулевое значение. */

int apply_binary_function(number (*function)(number, number),

 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);

  • Читать дальше
  • 1
  • ...
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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