, поэтому мне нужно создать 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 верхних значения из стека. Поместите оператор со значениями в качестве аргументов и сформируйте строку. Инкапсулируйте полученную строку в круглые скобки. Переместите полученную строку обратно в стек.
Если в стеке есть только одно значениеЭто значение в стеке является искомой инфиксной строкой.
Если в стеке есть другие значения Показать ошибку / * Введенные пользователем данные имеют слишком много значений * /