尝试评估后缀表达式的链接堆栈的分段错误

时间:2016-05-25 19:53:23

标签: c linked-list stack postfix-notation

我正在尝试实现一个链接堆栈来评估修复后的表达式但是我不断遇到分段错误而不确定如何修复它。我是c编程的新手,与OOD不同,所以欢迎任何建议。谢谢你&请原谅我的评论和间距。

 #include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>

struct node {
int data;
struct node *next;
};
 struct node *top = NULL;


void push(int data);
int pop();
int evaluatePostfix(char* exp);

void main() {
     char postfixExp[256];

     printf("What is your Postfix Expression? : \n");

     fgets(postfixExp, sizeof(postfixExp), stdin);
     printf("%d\n", evaluatePostfix(postfixExp));
}

//done
void push(int data) {
     struct node *newNode;
     newNode = (struct node*)malloc(sizeof(struct node));;
     (*newNode).data = data;
     (*newNode).next = NULL;
     //use isEmpty if can
     if (top != NULL) {
         (*newNode).next = top;
     }
     top = newNode;
}
//done
int pop() {
    struct node *temp = top;
    int *remove;
    //use isEmpty if can
    if (top != NULL) {
        *remove = (*top).data;
        top = (*top).next;
        free(temp);
    }
return *remove;

}

 int evaluatePostfix(char* exp) {
     struct node *top = NULL;
     for (int i = 0; i < sizeof(exp); i++) {
      if (isdigit(exp[i])) {
        push(exp[i]);
    } else {
        int val1 = pop();
        int val2 = pop();
        switch(exp[i]) {
            case '+':
                push(val2+val1);
                break;
            case '-':
                push(val2-val1);
                break;
            case '*':
                push(val2*val1);
                break;
            case '/':
                push(val2/val1);
                break;
        }
    }
}
return pop();

}

1 个答案:

答案 0 :(得分:0)

我完全不知道你的错误,价值误差归因于很多因素

  
      
  1. @Eugene Sh指出。 int remove将其数据类型更改为整数

  2.   
  3. 你正在迭代的循环是表达式的两倍,因为你使用的是常量文字,你应该使用for (int i = 0; i < strlen(exp)-1; i++)减去1,因为\0

  4.   
  5. 你在这里做的是

  6.   
   if (isdigit(exp[i])) {
    push(exp[i]);
} else {
    int val1 = pop();
    int val2 = pop();

因为34+是表达式,所以您使用isdigit(exp[i])

进行了检查
  

isdigit(exp [i])仅检查传递的字符是否为十进制数字。

(exp[i]) ascii值48减去0,将十进制ascii字符转换为整数

像这样修改你的代码

  
      
  1.   
 int pop() {
struct node *temp = top;
int removed;
//use isEmpty if can
if (top != NULL) {
    removed = (*top).data;
    top = (*top).next;
    free(temp);
 }
 return removed;
}
  

2及3

for (int i = 0; i < strlen(exp)-1; i++) {
  if (isdigit(exp[i])) {
    push(exp[i]-48);
} else {
    int val1 = pop();
    int val2 = pop();
printf("val1%d\n",val1);
printf("val2%d\n",val2);

您的工作代码     http://ideone.com/z58Phy