инфиксное выражение для префикса в c

Мы должны написать функцию для преобразования инфикса в префикс, а также сказать, является ли инфиксная функция недействительной или нет из-за размещения скобок, а затем вычислить окончательный ответ через язык c для присваивания. Я попытался решить эту проблему, но у меня была сброшена ошибка ядра ошибки сегментации. Вот мой код: -

      #include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int top = -1;
char stack[100];

void push(char a)
{
    stack[top] = a;
    top++;
}

char pop()
{   
    char a;
    a=stack[top];
    top--;
    return a;
}
 
void find_top()
{
    if (top == -1)
        printf("\nexpression is valid\n");
    else
        printf("\nexpression is invalid\n");
}

const char* reverse(char array[30]){
    int i,j;
    char temp[100];
    for (i=strlen(array)-1,j=0;i+1!=0;i--,j++) {
        temp[j]=array[i];
    }
    temp[j]='\0';
    strcpy(array,temp);
    return array;
}

int prcd(symbol)  {
    switch(symbol) {
        case '+':
        case '-':
        return 2;
        break;
        case '*':
        case '/':
        return 4;
        break;
        case '$':
        case '^':
        return 6;
        break;
        case '#':
        case '(':
        case ')':
        return 1;
        break;
    }
}

int isOperator(char symbol) {
    switch(symbol) {
        case '+':
        case '-':
        case '*':
        case '/':
        case '^':
        case '$':
        case '&':
        case '(':
        case ')':
        return 1;
        break;
        default: return 0;
    }
}

void infixtoprefix(char infix[20],char prefix[20]) {
    int i,j=0;
    char symbol;
    stack[++top]='#';
    reverse(infix);
    for (i=0;i<strlen(infix);i++) {
        symbol=infix[i];
        if (isOperator(symbol)==0) {
            prefix[j]=symbol;
            j++;
        } else {
            if (symbol==')') {
                push(symbol);
            } else if(symbol == '(') {
                while (stack[top]!=')') {
                    prefix[j]=pop();
                    j++;
                }
                pop();
            } else {
                if (prcd(stack[top])<=prcd(symbol)) {
                    push(symbol);
                } else {
                    while(prcd(stack[top])>=prcd(symbol)) {
                        prefix[j]=pop();
                        j++;
                    }
                    push(symbol);
                }
            }
        }
    }
    while (stack[top]!='#') {
        prefix[j]=pop();
        j++;
    }
    prefix[j]='\0';
}



int main()
{
    int i;
  int as,b,c;
  char infix[20],prefix[20],temp;
    char a[100],pref[100];
    printf("enter expression:");
    gets(a);
    for (i = 0; a[i] != '\0';i++)
    {
        if (a[i] == '(')
        {
            push(a[i]);
        }
        else if (a[i] == ')')
        {
            pop();
        }
    }
  strcpy(infix,a);
    find_top();
  infixtoprefix(infix,prefix);
    strcpy(pref,reverse(prefix));
  printf("%s",pref);
  for(i=strlen(pref)-1;i>=0;i--)
    {
        if(pref[i]=='+')
        {
            c=pop()+pop();
            push(c);
        }
        else if(pref[i]=='-')
        {
            as=pop();
            b=pop();
            c=b-as;
            push(c);
        }
        else if(pref[i]=='*')
        {   as=pop();
        b=pop();
        c=b*as;
        push(c);
        }
        else if(pref[i]=='/')
        {
            as=pop();
            b=pop();
            c=b/as;
            push(c);
        }
        else
        {
            push(pref[i]-48);
        }
    }
    printf("\nFinal ans = %d",pop());
}


0 ответов

Другие вопросы по тегам