这是我在spoj中的问题id-4的代码,它在ideone.com中运行完美,但是在它显示分段错误,我无法找到bug.Please help。我已经使用堆栈来实现它。谢谢你提前。 exp是输入字符串,out是输出字符串,int l跟踪输出字符串的索引
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//declarations
int top = 0;
void push(char ch);
char pop();
int prec(char c);
char stack[20];
char out[20];
int l = 0;
int main() {
char exp[20];
int x, t;
char temp;
int i = 0;
scanf("%d", &t); //no. of test cases
while (t--) {
l=0;
scanf("%s", exp);
stack[0] = '('; //initially pushing '('
x = strlen(exp);
exp[x] = ')'; //for completion of statement
for (i = 0; i < x + 1; i++) {
if (exp[i] == '+' || exp[i] == '-' ||
exp[i] == '/' || exp[i] == '*' || exp[i] == '^') { //operators
while (prec(exp[i]) < prec(stack[top])) { //checking precedence
out[l] = pop();
l++;
}
push(exp[i]);
} else
if (exp[i] == '(') {
push(exp[i]);
} else
if (exp[i] == ')') {
while (stack[top] != '(') {
out[l] = pop();
l++;
}
temp = pop(); //to throw out '('
} else {
out[l] = exp[i]; //variables
l++;
}
}
for (i = 0; i < l; i++) {
printf("%c", out[i]); //output
}
}
return 0;
}
void push(char c) { //push operation on stack
if (top >= 19) {
} else {
top++;
stack[top] = c;
}
return;
}
char pop() { //pop operation on stack
char t;
if (top <= -1) {
return 0;
} else {
t = stack[top];
top--;
return t;
}
}
int prec(char c) { //precedence check
if (c == 94) { return 5; }
else if (c == 47) { return 4; }
else if (c == 42) { return 3; }
else if (c == 43) { return 2; }
else if (c == 45) { return 1; }
else { return 0; }
}
答案 0 :(得分:1)
您必须检查top
是否大于或等于0
:
while( top >= 0 && prec(exp[i])<prec(stack[top])){
// ^^^^^^^^
....
while( top >= 0 && stack[top]!='('){
// ^^^^^^^^
发生细分错误,因为您访问stack[top]
且top
小于0
。除此之外,我建议一致地增加数组exp
和out
的大小。
答案 1 :(得分:1)
用于读取表达式的缓冲区非常小:char exp[20];
并且您不会因缓冲区溢出而保护scanf
。
Sphere Online Judge指定:
<强>输入强>
t [表达式的数量&lt; = 100]
表达式[长度&lt; = 400]
[其他表达]
您应该使用更大的堆栈,至少100,更大的缓冲区并使用:
char exp[402];
...
scanf("%400s", exp);
同时测试scanf("%d", &t)
的返回值,以防他们故意给你错误的输入。