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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы