Я искал сайт, чтобы узнать, есть ли какие-либо подобные вопросы для моего, но я не могу найти тот, который предлагает рабочее решение. Ниже приведен код полнофункционального infix для постфикса конвертер для арифметического синтаксиса.Интервал между операндами программы Infix-Postfix в C
Проблема заключается в том, что если пользователь вводит строку, такую как 23+89
, выход infix составляет 2389+
. Это, конечно, правильно, однако я хочу добавить разделители между операндами, чтобы различать 23
и 89
. Как это можно реализовать с массивом, который я использую? Нужно ли добавлять символ пробела между операндами в массиве? Как это можно достичь?
Любое понимание будет принята с благодарностью.
#include <stdio.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
#define MAX 100 // maximum number of input characters
int precedence(char x);
struct stack
{
char my_stack[MAX];
int pointer;
};
int precedence(char x)
{
if(x == '(')
return(0);
if(x == '+' || x == '-')
return(1);
if(x == '*' || x == '/')
return(2);
return(3);
}
int main(void)
{
struct stack S;
S.pointer = 0;
char c;
char output[MAX]; // stores output
int out_count = 0; // stores no. of characters of output
char data; // stores data being popped off the stack
printf("Enter an expression to check:\n");
fflush(stdout);
while(('\n' != (c=getchar())))
{
if(isdigit(c)) // if an operand is found print to screen
{
output[out_count] = c;
out_count++;
}
else if(c == '(') // if (is found push on stack
{
S.pointer = S.pointer +1;
S.my_stack[S.pointer] = c;
}
else if(c == ')') // if) is found pop stack until (is found
{
while(!(S.my_stack[S.pointer] == '('))
{
data = S.my_stack[S.pointer];
output[out_count] = data;
out_count++;
S.pointer = S.pointer -1;
}
S.pointer = S.pointer -1; // pop the extra (
}
else if(c == '*' || c == '/' || c == '+' || c == '-')
{
if((S.pointer) == 0)
{
S.pointer = S.pointer +1;
S.my_stack[S.pointer] = c;
}
else
{
if(precedence(S.my_stack[S.pointer]) > precedence(c))
{
// pop stack
int i;
for(i=(S.pointer); i >= 0; i--)
{
if(c == '(' || c == ')')
continue;
output[out_count] = c;
out_count++;
}
S.pointer = 0;
}
else
{
// push c on stack
S.pointer = S.pointer +1;
S.my_stack[S.pointer] = c;
}
}
}
}
int j = S.pointer;
while(j != 0)
{
if(S.my_stack[j] == '(')
continue;
output[out_count] = S.my_stack[j];
out_count++;
j--;
}
output[out_count+1] = '\0';
int k=0;
while(output[k] != '\0') // go through output array and print
{
printf("%c", output[k]);
k++;
}
return 0;
}
Любопытно: почему '()' иногда вокруг возвращаемых значений, таких как 'return (3);'? – chux