我第一次尝试在 spoj 上提交解决方案,这是我解决在spoj 上转换表达式问题的解决方案。我收到 SIGSEV 错误,这是一个运行时错误,分段错误。我在我的代码中检查了很多,但我没有在我的代码中看到任何此类错误。请帮助解决这个问题。
我有编辑过的代码:-
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int precedence(char c)
{
switch (c)
{
case '/':
return 2;
case '*':
return 2;
case '+':
return 1;
case '-':
return 1;
case '^':
return 3;
case ')':
return 4;
case '(':
return -1;
default:
return -1 ;
}
}
int main()
{
//char input[400]="a*(b+c)-d/e";
// char input[400]="a+b*c-d/e*f";
// char input[400] = "(a+b*c-d)/(e*f)";
// char input[400] = "(a+(b*c))" ;
//char input[400] = "((a+b)*(z+x))";
// char input[400] = "((a+t)*((b+(a+c))^(c+d)))";
char input[402];
char *stack;
char *output;
char *p = input ;
int i , top , t , l ;
scanf("%d",&t);
while (t-- != 0 )
{
scanf("%s",input);
p = input ;
i = 0 ;
top = 0 ;
l = strlen(input);
stack = (char *)malloc(sizeof(strlen(input)));
output = (char *)malloc(sizeof(strlen(input)));
stack[top++]='(';
*(p+l)=')';
*(p+l+1)= '\0';
while(p[0] != '\0')
{
if (p[0] >= 'a' && p[0] <= 'z' )
{
output[i]=p[0];
i++;
}
else if (p[0] == '(')
{
stack[top++] = p[0];
}
else if (p[0] == ')')
{
while (stack[top-1] != '(')
{
--top;
output[i] = stack[top];
i++ ;
}
//to remove the left parenthesis
top--;
}
else if (p[0] == '+' || p[0] == '-' || p[0] == '*' || p[0] == '/' || p[0]=='^')
{
while(precedence(stack[top-1]) >= precedence(p[0]))
{
output[i]=stack[top-1];
top--;
i++;
//j = k;
}
stack[top] = p[0];
top++;
}
p++;
}
printf("%s\n",output);
free(stack);
free(output);
for(i = (strlen(input)-1) ; i >= 0 ; i--)
input[i]='\0';
}
return 0 ;
}