首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

尝试在C中通过结构实现堆栈,但得到以下代码的运行时错误。谁能解释并指出哪里出了问题?

在C语言中,通过结构实现堆栈的代码如下:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void push(Stack *stack, int item) {
    if (stack->top == MAX_SIZE - 1) {
        printf("Stack Overflow\n");
        return;
    }
    stack->data[++stack->top] = item;
}

int pop(Stack *stack) {
    if (stack->top == -1) {
        printf("Stack Underflow\n");
        return -1;
    }
    return stack->data[stack->top--];
}

int main() {
    Stack stack;
    stack.top = -1;

    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);

    printf("%d\n", pop(&stack));
    printf("%d\n", pop(&stack));
    printf("%d\n", pop(&stack));
    printf("%d\n", pop(&stack));

    return 0;
}

这段代码实现了一个基本的堆栈数据结构。其中,结构体Stack包含一个整型数组data和一个整型变量top,用于存储堆栈元素和记录栈顶位置。push函数用于将元素入栈,pop函数用于将元素出栈。在main函数中,我们创建了一个堆栈对象stack,并进行了一些入栈和出栈操作。

然而,这段代码存在一个运行时错误。当我们尝试从空栈中进行出栈操作时,会导致数组越界访问,从而引发未定义的行为。具体来说,当栈为空时,pop函数会返回-1,但在main函数中,我们没有对返回值进行判断,直接打印出来。因此,当尝试从空栈中进行出栈操作时,会打印出-1,而不是提示栈下溢(Stack Underflow)的错误信息。

为了解决这个问题,我们可以在pop函数中增加一个标志位来表示栈是否为空,然后在main函数中根据该标志位来判断是否打印出栈下溢的错误信息。修改后的代码如下:

代码语言:txt
复制
#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

typedef struct {
    int data[MAX_SIZE];
    int top;
} Stack;

void push(Stack *stack, int item) {
    if (stack->top == MAX_SIZE - 1) {
        printf("Stack Overflow\n");
        return;
    }
    stack->data[++stack->top] = item;
}

int pop(Stack *stack, int *isEmpty) {
    if (stack->top == -1) {
        *isEmpty = 1;
        return -1;
    }
    *isEmpty = 0;
    return stack->data[stack->top--];
}

int main() {
    Stack stack;
    stack.top = -1;

    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);

    int isEmpty;
    printf("%d\n", pop(&stack, &isEmpty));
    if (isEmpty) {
        printf("Stack Underflow\n");
    }
    printf("%d\n", pop(&stack, &isEmpty));
    if (isEmpty) {
        printf("Stack Underflow\n");
    }
    printf("%d\n", pop(&stack, &isEmpty));
    if (isEmpty) {
        printf("Stack Underflow\n");
    }
    printf("%d\n", pop(&stack, &isEmpty));
    if (isEmpty) {
        printf("Stack Underflow\n");
    }

    return 0;
}

在修改后的代码中,我们在pop函数的参数中增加了一个指向整型变量isEmpty的指针。当栈为空时,将isEmpty设置为1,否则设置为0。在main函数中,我们通过判断isEmpty的值来决定是否打印出栈下溢的错误信息。

这样修改后的代码可以正确处理栈下溢的情况,避免了运行时错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 程序的基本概念

    程序的基本概念 1.1. 程序和编程语言 程序(Program)告诉计算机应如何完成一个计算任务,这里的计算可以是数学运算,比如解方程,也可以是符号运算,比如查找和替换文档中的某个单词。从根本上说,计算机是由数字电路组成的运算机器,只能对数字做运算,程序之所以能做符号运算,是因为符号在计算机内部也是用数字表示的。此外,程序还可以处理声音和图像,声音和图像在计算机内部必然也是用数字表示的,这些数字经过专门的硬件设备转换成人可以听到、看到的声音和图像。 程序由一系列基本操作组成,基本操作有以下几类: 输入(Input) 从键盘、文件或者其他设备获取数据。

    02
    领券