在C编程中实现堆栈的推送方法

Nod*_*der 2 c stack data-structures

开发商!我在C中有一个堆栈的push()方法的问题!

我在C中实现了自己的push()方法!但我无法理解结果!

我的堆栈代码如下

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

#define MAX_SIZE 10

int top = -1;
int array[MAX_SIZE];

void init(){
    top = -1;
}

void push(int array[], int data){

    if(top > MAX_SIZE-1)
        fprintf(stderr, "invalid top %d\n", top+1);
    else{
        array[++top] = data; // top == 9, ++top == 10
        printf("top: %d data: %d\n", top+1, array[top]); // top == 11, top == 10
    }
}
void pop(int array[]){

}
void peek(int array[]){

}

int main() {
   int data = 1;

   for (int i=0; i<MAX_SIZE; i++)
        push(array, data++);
   push(array, 100);
   push(array, 200); // invalid top
   push(array, 300); // invalid top
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的结果如下

top: 1 data: 1
top: 2 data: 2
top: 3 data: 3
top: 4 data: 4
top: 5 data: 5
top: 6 data: 6
top: 7 data: 7
top: 8 data: 8
top: 9 data: 9
top: 10 data: 10
top: 11 data: 100
invalid top 11 
invalid top 11
Run Code Online (Sandbox Code Playgroud)

我不明白的是......在结果中,顶部:11,实际上,它就像顶部:顶部+ 1.如果你在我的push()方法中查看else语句,你可以注意到它.

但是,在其他声明中,何时

printf("top: %d data: %d\n", 11, array[10]);
the result: top: 11 data: 100
Run Code Online (Sandbox Code Playgroud)

,我认为这应该是一个错误.因为我声明数组大小为10,即MAX_SIZE.因此索引大小将为0~9.但是数组[10]如何工作?

我真的不明白.

小智 5

你可以这样做,因为C允许你这样做.但你不应该因为在未分配的内存区域写入是危险的.您的数组已分配10个长度的整数.分配内存的10个整数.您尝试访问的第11个整数没有为其分配内存.

如评论中所述,如果您希望代码抛出错误,您需要的功能是绑定检查.这正是你在push函数的第一部分所做的.

改变您的条件以top >= MAX_SIZE - 1解决问题.

至于实现堆栈的更好方法,您可以尝试在链表上实现一个,这允许您在已停止的内存区域中管理堆栈.

您也可以使用unsigned int数组索引,因为那里不需要负数.