Обратная польская запись. Оптимизация. Си. - 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; }