Как сделать инфикс в постфиксную функцию в ARM Assembly - PullRequest
0 голосов
/ 31 октября 2019

, поэтому мне нужно создать 2 функции, одну для преобразования данной функции из инфикса в постфикс в сборке. Другой - конвертировать данную функцию из постфикса в инфикс. Я создал для него псевдокод и код на C, но перевести его на ARM сложно. Должен ли я остаться с этой логикой и попытаться сделать сборку ARM на ее основе, или мне следует изменить способ перехода к коду в 32-битной сборке ?? Мы приветствуем любую помощь* Если отсканированный символ является операндом, выведите его.

Иначе,… ..3.1 Если приоритет отсканированного оператора больше, чем приоритет оператора в стеке (илистек пуст или стек содержит '('), нажмите его.

3.2 Иначе, извлеките все операторы из стека, которые имеют больший или равный приоритет, чем оператор сканирования. выполняя это, перенесите отсканированный оператор в стек. (Если вы столкнулись с круглыми скобками во время всплывающего сообщения, остановитесь и вставьте отсканированный оператор в стек.)

Если отсканированный символ является '(', поместите его в стек.

Если отсканированный символ представляет собой') ', вытолкните стек и выводите его до тех пор, пока не встретится' ('), и не используйте оба скобка.

Повторите шаги 2-6до тех пор, пока не сканируется инфиксное выражение.

Вывод на печать вывода

Вывод и вывод из стека, пока он не станет пустым.

C-код:

// C program to convert infix expression to postfix    
//Stack type 

struct Stack 

{ 

    int top; 

    unsigned capacity; 

    int* array; 

}; 


// Stack Operations 

struct Stack* createStack( unsigned capacity ) 

{ 

    struct Stack* stack = (struct Stack*) malloc(sizeof(struct Stack)); 

    if (!stack)  

        return NULL; 

    stack->top = -1; 

    stack->capacity = capacity; 

    stack->array = (int*) malloc(stack->capacity * sizeof(int)); 

    if (!stack->array) 

        return NULL; 

    return stack; 

} 

int isEmpty(struct Stack* stack) 

{ 

    return stack->top == -1 ; 

} 

char peek(struct Stack* stack) 

{ 

    return stack->array[stack->top]; 

} 

char pop(struct Stack* stack) 

{ 

    if (!isEmpty(stack)) 

        return stack->array[stack->top--] ; 

    return '$'; 

} 

void push(struct Stack* stack, char op) 

{ 

    stack->array[++stack->top] = op; 

} 




// A utility function to check if the given character is operand 
int isOperand(char ch) 
{ 
    return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'); 
} 

// A utility function to return precedence of a given operator 

// Higher returned value means higher precedence 

int Prec(char ch) 

{ 

    switch (ch) 

    { 

    case '+': 

    case '-': 

        return 1; 

    case '*': 

    case '/': 

        return 2; 

    case '^': 

        return 3; 
    } 

    return -1; 
} 


// The main function that converts given infix expression 
// to postfix expression.  


int infixToPostfix(char* exp) 

{ 

    int i, k; 

    // Create a stack of capacity equal to expression size  

    struct Stack* stack = createStack(strlen(exp)); 

    if(!stack) // See if stack was created successfully  
        return -1 ; 

    for (i = 0, k = -1; exp[i]; ++i) 

{ 
        // If the scanned character is an operand, add it to output. 

        if (isOperand(exp[i])) 

            exp[++k] = exp[i]; 

        // If the scanned character is an ‘(‘, push it to the stack. 

        else if (exp[i] == '(') 

            push(stack, exp[i]); 

        // If the scanned character is an ‘)’, pop and output from the stack  
        // until an ‘(‘ is encountered. 

        else if (exp[i] == ')') 

        { 
            while (!isEmpty(stack) && peek(stack) != '(') 

                exp[++k] = pop(stack); 

            if (!isEmpty(stack) && peek(stack) != '(') 

                return -1; // invalid expression   

            else

                pop(stack); 

        } 

        else // an operator is encountered 

        { 

            while (!isEmpty(stack) && Prec(exp[i]) <= Prec(peek(stack))) 

                exp[++k] = pop(stack); 

            push(stack, exp[i]); 

        } 


    } 

    // pop all the operators from the stack 

    while (!isEmpty(stack)) 

        exp[++k] = pop(stack ); 

    exp[++k] = '\0'; 

    printf( "%s", exp ); 
} 

и У меня также есть этот псевдокод для руки с той же целью: (У меня нет C-кода для этого)

1. Пока остается символ ввода

Считать следующий символ с входа.

Если символ является операндом Поместить его в стек.

В противном случаесимвол является оператором.

Если в стеке меньше 2 значений Показать ошибку / * введите недостаточно выражений в выражении * /

Иначе Выскочить 2 верхних значения из стека. Поместите оператор со значениями в качестве аргументов и сформируйте строку. Инкапсулируйте полученную строку в круглые скобки. Переместите полученную строку обратно в стек.

Если в стеке есть только одно значениеЭто значение в стеке является искомой инфиксной строкой.

Если в стеке есть другие значения Показать ошибку / * Введенные пользователем данные имеют слишком много значений * /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...