2401_84401465 2024-11-10 16:06 采纳率: 71.4%
浏览 5

我的代码为什么运行不了?


#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
typedef struct {
    int *data;
    int top;
}Stack;

Stack* initstack() {
    Stack* s = (Stack*)malloc(sizeof(Stack));
    s->data = (int*)malloc(sizeof(int) * MaxSize);
    s->top = -1;
    return s;
}

int PushElem(Stack* S, int e) {
    if (S->top == MaxSize - 1)
        return 0;
    else {
        S->data[S->top] = e;
        S->top++;
        return 1;
    }
}//压栈

int pop(Stack* s, int* e) {
    if (s->top == -1)
        return 0;
    else {
        *e = s->data[s->top];
        s->top--;
        return 1;
    }
}//出栈

int gettop(Stack* s) {
    if (s->top == -1)
        return 0;
    int e = s->data[s->top];
    return e;
}
int main() {
    Stack* S = initstack();
    PushElem(S, 4);
    PushElem(S, 76);
    PushElem(S, 87);
    PushElem(S, 29);
    PushElem(S, 0);
    for (int i = 0; i < S->top; i++) {
        printf("%d\n", S->data[i]);
    }
    int* e = NULL;
    pop(S, e);
    printf("出栈成功,元素为%d\n", *e);
    printf("栈顶元素为%d\n", gettop(S));
    return 1;
}

img

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-11-10 16:07
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    你的代码中存在几个问题,这可能是导致程序无法正常运行的原因。我会逐一列出并给出解决方案。

    问题一:你的栈结构体定义中,top变量初始化为-1表示空栈,但在PushElem函数中,当S->top == MaxSize - 1时,函数会返回0表示栈已满。然而,由于栈初始化时top已经是-1,这个条件永远不会满足,导致栈无法正确地添加元素。正确的做法应该是初始化栈时top设为0,因为数组索引从0开始计数。当top == MaxSize - 1时表示栈已满,不能添加元素。当top == -1时表示栈为空,不能删除元素。这是你的第一个问题。修改如下:

    Stack* initstack() {
        Stack* s = (Stack*)malloc(sizeof(Stack));
        s->data = (int*)malloc(sizeof(int) * MaxSize);
        s->top = 0; // 修改这里为初始值为0
        return s;
    }
    

    问题二:你的代码中未正确初始化堆栈后可能出现了内存访问问题,也就是说当你试图在栈顶访问或修改数据时,可能访问到了未分配的内存空间或者已经释放的内存空间。这是你的第二个问题。确保你的堆栈操作都在有效的内存范围内进行。同时,对于动态分配的内存空间,记得在使用完毕后释放它们以防止内存泄漏。在程序结束时添加以下代码释放内存:

    free(S->data); //释放栈内动态分配的内存空间
    free(S); //释放栈结构体的内存空间
    

    问题三:在 pop 函数中,你试图通过指针 e 返回出栈的元素值,但是在函数内部并没有给这个指针分配任何值。你需要确保指针 e 在函数内部被正确赋值。修改如下:

    int pop(Stack* s, int* e) {
        if (s->top == -1) //注意这里是判断栈是否为空,如果为空则无法出栈
            return 0; //返回错误码(例如:返回-1)表示无法出栈
        else {
            *e = s->data[s->top]; // 通过指针 e 返回出栈的元素值
            s->top--; // 更新栈顶指针向下移动一位(出栈操作)
            return 1; // 返回成功码(例如:返回 0)表示出栈成功
        }
    } //出栈函数修改如上所示,确保通过指针 e 返回正确的值并且处理可能的空栈情况。对于错误的代码部分,我已删除以避免混淆。现在你可以尝试运行你的程序并检查是否还有任何问题。记得检查堆栈操作的边界条件以避免越界访问和空指针引用等问题。此外,请确保在调用堆栈操作函数之前已经正确初始化了堆栈对象。希望这些修改能帮助你解决问题!如果还有任何问题或需要进一步的帮助,请随时向我询问。
    
    评论

报告相同问题?

问题事件

  • 创建了问题 11月10日