反向波兰符号计算器在c.



我正在用c编程一个rnp计算器。我有两个问题:

  1. 当我写3 a 3 +之类的东西时,一切都很好。我得到了正确的解决方案,我的程序忽略了a(这是应该的)。但是通过只输入一个例如,我得到一个分割错误。
  2. 当我输入太多操作符时,我也会得到分割错误,例如3 5 + +。

我认为问题出在"void process"…

typedef struct _stack stack;
typedef struct _stack_element stack_element;
struct _stack {
stack_element* top;
};
struct _stack_element {
stack_element* next;
float value;
};
void stack_push(stack* astack, float value)
{
stack_element *elem1 = (stack_element *) malloc(sizeof(stack_element));

elem1->value = value;
elem1->next = astack->top;
astack->top = elem1;
}
float stack_pop(stack* astack)
{
float cur;
if (astack == NULL) {
cur = NAN;
}
else {
cur = astack->top->value;
stack_element *nxt = astack->top->next;
free(astack->top);
astack->top = nxt;

}
return cur;
}
void process(stack* astack, char* token)
{
if(is_number(token) == 1) {
float number = atof(token);
stack_push(astack, number);
}
else if (is_add(token) == 1) {
float number1 = stack_pop(astack);
float number2 = stack_pop(astack);
stack_push(astack, (number1 + number2)); 
}
else if(is_sub(token) == 1) {
float number1 = stack_pop(astack);
float number2 = stack_pop(astack);
stack_push(astack, (number2 - number1));
}
else if(is_mult(token) == 1) {
float number1 = stack_pop(astack);
float number2 = stack_pop(astack);
stack_push(astack, (number1 * number2));
}
printf("n<Logik fehlt!>n");
return;
stack* create_stack() {
/* HIER implementieren */
stack *newstack = (stack *) calloc(1, sizeof(stack));
newstack->top = NULL;
return newstack;
}

您的stack_pop函数将在您从堆栈中弹出最后一个元素后将astack->top设置为空指针。

但是你从来没有检查过这个,你从来没有检查过一个空的堆栈

修改astack为空指针的条件检查,同时检查空堆栈:

if (astack == NULL || astack->top == NULL)

最新更新