我正在将中缀转换为后缀,这是我的代码,任何人都可以找出我为什么遇到分段错误吗? 为什么我遇到细分错误?请解释。我尝试了多次,但我还是得到了同样的东西。请帮忙。
是因为我占用了过多的内存还是什么?还是我的程序花费太多时间执行?
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define MAX 100
char infix[MAX],postfix[MAX];
int top = -1;
char stack[MAX];
void push(char element){
if(top == MAX-1)
{
printf("Error: Stack Overflow\n");
}
else
{
top = top +1;
stack[top] = element;
}
}
char pop(){
if (top == -1)
printf("Error: Stack Underflow\n");
else
{
return stack[top];
top = top -1;
}
}
int precedence(char symbol){
switch(symbol){
case '+':
case '-':
return 2;
break;
case '*':
case '/':
case '%':
return 3;
break;
case '(':
case ')':
case '#':
return 1;
break;
default:
return 0;
break;
}
}
void infixtopostfix(char infix[],char postfix[]){
int i=0,j=0;
char symbol;
stack[++top] = '#';
for (i=0;i<strlen(infix);i++){
symbol = infix[i];
if(isalnum(symbol)){
postfix[j] = symbol;
j++;
}
else if (symbol == '('){
push(symbol);
}
else if (symbol == ')'){
while(stack[top] != '('){
postfix[j] = pop();
j++;
}
pop(); //This will pop out ( from the stack.
}
else{
if (precedence(symbol)>stack[top]){
push(symbol);
}
else{
while(precedence(symbol)<=stack[top]){
postfix[j] = pop();
j++;
}
push(symbol);
}
}
}
while(stack[top] != '#'){
postfix[j] = pop();
j++;
}
postfix[j] = '\0';
}
void main(){
printf("Enter an infix expression:\t");
scanf("%s",infix);
infixtopostfix(infix,postfix);
printf("The infix expression is: %s",infix);
printf("The postfix expression is: %s",postfix);
}
答案 0 :(得分:0)
免责声明:我没有仔细看过您的代码,只是粗略地浏览了一下。
您的pop()函数格式不正确。
if (top == -1)
printf("Error: Stack Underflow\n");
else
{
return stack[top];
top = top -1;
}
1)我非常确定它甚至不会编译(或者至少您的C编译器会抛出一些错误),因为如果top == -1,则此函数甚至不会返回任何内容。 2)该函数在更新“ top”之前返回。这意味着最大递减实际上不会发生,因此堆栈会由“ top”连续索引。
这可能不是导致段错误的直接原因,但这是一个很好的起点。作为与@ Ripi2的精神建议,我建议您使用调试器(即GDB),printf语句或内存分析器(例如valgrind)来调试此代码。
答案 1 :(得分:0)
主要-> 您在比较stack[top]
值时忘记将precedence
作为参数传递给precedence
。
仅当堆栈中存在某些元素时才调用pop()
函数-最好使top
代表否。堆栈中当前存在的元素数量(使用 0 而不是 -1 初始化。
IMP-> 在pop()
函数(或任何其他函数)中,一旦执行了return
语句,便无法修改top=top-1
- ->最好将其设置为return stack[--top]
。
这是正确的代码:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
char infix[MAX],postfix[MAX];
int top = 0;
char stack[MAX];
void push(char element){
if(top == MAX-1)
{
printf("Error: Stack Overflow\n");
}
else
{
stack[top++] = element;
}
}
char pop(){
if (top ==1)
printf("Error: Stack Underflow\n");
else
{
return stack[--top];
}
}
int precedence(char symbol){
printf("pre%d\n\n",symbol);
if((symbol=='+')||(symbol=='-')
return 1;
if((symbol=='*')||(symbol=='/')||(symbol=='%'))
return 2;
else
return 0;
}
void infixtopostfix(char infix[],char postfix[]){
int i=0,j=0;
char symbol;
stack[++top] = '#';
for (i=0;i<strlen(infix);i++){
symbol = infix[i];
if(isalnum(symbol)){
postfix[j] = symbol;
j++;
}
else if (symbol == '('){
push(symbol);
}
else if (symbol == ')'){
while(stack[top] != '('){
postfix[j] = pop();
j++;
}
pop(); //This will pop out ( from the stack.
}
else{
while((top>1)&&(precedence(symbol)<=precedence(stack[top-1]))){
postfix[j] = pop();
j++;
}
push(symbol);
}
}
while(top>1){
postfix[j] = pop();
j++;
}
postfix[j] = '\0';
}
int main(){
printf("Enter an infix expression:\t");
scanf(" %s",infix);
infixtopostfix(infix,postfix);
printf("The infix expression is: %s",infix);
printf("The postfix expression is: %s",postfix);
return 0;
}