Обратная польская запись. Оптимизация. Си. - C (СИ)
Формулировка задачи:
Спортивный интерес
Код выполняется на одной из online judge систем. Используется компилятор gcc 4.3.2.
Данный код выполняется за 0.00 секунд и съедает 1.6Мб памяти. В топовых результатах найдено выполнение с 1.5Мб памяти. Само собой код посмотреть нельзя. Не пойму как они это делают
Задача:
На вход в первой строке подается количество тестов. В каждой следующей по одному тесту. Выражение может содержать операции: +, -, *, /, ^. В качестве переменных только прописные буквы латинского алфавита [a-z].
Количество тестов . Длина каждого выражения .
Что-нибудь еще здесь можно улучшить?
Input: 3 (a+(b*c)) ((a+b)*(z+x)) ((a+t)*((b+(a+c))^(c+d))) Output: abc*+ ab+zx+* at+bac++cd+^*
#include <stdio.h> /* Global constants */ #define STACK_SIZE 200 #define DATA_SIZE 400 /* Tokens */ #define TOKEN_ADD '+' #define TOKEN_SUB '-' #define TOKEN_MUL '*' #define TOKEN_DIV '/' #define TOKEN_POW '^' #define TOKEN_LBR '(' #define TOKEN_RBR ')' /* Actions */ #define ACTION_GET_FROM_BUFER 0 #define ACTION_PUSH_TO_STACK 1 #define ACTION_GET_FROM_STACK 2 #define ACTION_POP_FROM_STACK 3 /* Action matrix */ static int actions[5][4] = { { 0, 0, 0, 0 }, { 1, 2, 2, 1 }, { 1, 1, 2, 1 }, { 1, 1, 1, 1 }, { 4, 2, 2, 3 } }; static __inline__ int priority(char token) { switch (token) { case TOKEN_ADD: case TOKEN_SUB: return 1; case TOKEN_MUL: case TOKEN_DIV: case TOKEN_POW: return 2; case TOKEN_LBR: return 3; case TOKEN_RBR: return 4; } return 0; } static char stack[STACK_SIZE + 1]; static char buf[DATA_SIZE + 1]; static char out[DATA_SIZE + 1]; int main() { char *pbuf, *pout, *ptop; int iterations; fscanf(stdin, "%d", &iterations); while (iterations--) { fscanf(stdin, "%s", buf); pbuf = buf; pout = out; ptop = stack; while (*pbuf) { switch (actions[priority(*pbuf)][priority(*ptop)]) { case ACTION_GET_FROM_BUFER: *pout++ = *pbuf++; break; case ACTION_PUSH_TO_STACK: *(++ptop) = *pbuf++; break; case ACTION_GET_FROM_STACK: *pout++ = *ptop--; break; case ACTION_POP_FROM_STACK: --ptop; ++pbuf; /* no break, this isn't needed here */ } } while (stack != ptop) { if (*ptop != TOKEN_LBR && *ptop != TOKEN_RBR) *pout++ = *ptop; --ptop; } *pout = 0; puts(out); } return 0; }
Решение задачи: «Обратная польская запись. Оптимизация. Си.»
textual
Листинг программы
int main() { return 0; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д