入栈操作逻辑错误

Logical error in push operation in stack

我正在将堆栈作为数组进行插入操作,但我的程序在输入第一个值时崩溃。

typedef struct Stack
{
  int top;
  int elements[20];
}
stack;
stack *s;

void push(int x)
{
  s->top++;
  if(s->top<=19){
  s->elements[s->top]=x;}
  else
    puts("Overflow");
}

根据您目前的代码,您使用的似乎是 s 未初始化的。使用单元化内存调用 undefined behaviour 反过来 可能 导致分段错误。

为了防止单元化 s ,您可能需要像

这样修改您的代码
void push(int x)
{
  if (s)         //check if `s` has been initialized.
  {
      s->top++;
      if(s->top<=19)
      {
          s->elements[s->top]=x;
      }
      else
          puts("Overflow");
  }
  else
      //abort, return error or something similar
}

注意:

除了这里手头的问题,还有一个隐藏的问题,一旦你解决了这个问题就会出现。

在您的 push() 函数中,您 top 无条件地增加 。这意味着,即使堆栈已满,您的 top 值也会增加,稍后会导致错误计算。

你必须移动堆栈 top 增量部分也在值范围检查下。

看来你只是简单地定义了一个struct Stack类型的指针,而没有分配堆栈本身

stack *s;

因此s等于NULL。至少你应该自己分配堆栈。例如

stack *s;

//...
s = malloc( sizeof( struct Stack ) );

但无论如何都没有必要定义指针。您可以定义堆栈本身。例如

stack s;

您是否需要设置数据成员top的初始值。我想你可以用 -1.

初始化它

另外函数insert本身也是无效的。

void push(int x)
{
  s->top++;
  if(s->top<=19){
  s->elements[s->top]=x;}
  else
    puts("Overflow");
}

每次调用该函数时,它都会增加数据成员 top,即使它已指向数组之外。有效函数可能看起来像

void push(int x)
{
   if ( s->top + 1 < 20)
   {
      s->elements[++s->top] = x;
   }
   else
   [
       puts("Overflow");
   }
}