инфиксное выражение для префикса в 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());
}