顺序栈输入数字按Enter后闪退

#define STACKINIT 100
#define STACKPLUS 10
typedef int Elemtype;
typedef struct{
    Elemtype *top;
    Elemtype *base;
    int stacksize;
}Sqstack;
#include <stdio.h>
#include <stdlib.h>
#include "6.h"
Sqstack Initstack()
{
    Sqstack S;
    S.base=(Elemtype*)malloc(STACKINIT*sizeof(Elemtype));
    S.top=S.base;
    S.stacksize=STACKINIT;
    return S;
}
void Push(Sqstack *S,Elemtype e)
{
    if(S->top-S->base==S->stacksize)
    {
        S->base=(Elemtype*)realloc(S->base,(S->stacksize+STACKPLUS)*sizeof(Elemtype));
        S->stacksize+=STACKPLUS;
    }
    *S->top++=e;
}
void Stacktraverse(Sqstack S)
{
    while(S.top!=S.base)
    {
        Elemtype d=*--S.top;
        printf("%d",d);
    }
}
int main(int argc, char *argv[]) {
    int n;
    Sqstack S=Initstack();
    printf("输入一个非负十进制整数:\n");
    scanf("%d",&n); 
    while(n)
        Push(&S,n%2);
        n=n/2;
    Stacktraverse(S);
    return 0;
}

注意一下花括号,否则死循环

    while(n) {
        Push(&S,n%2);
        n=n/2;
    }

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7551513
  • 这篇博客也不错, 你可以看下多余的回车键(Enter)
  • 以下回答来自chatgpt:

    可能的原因有:

    1. 数组越界:如果你在使用顺序栈时没有检查栈的大小,当你输入的数字超出了栈的大小时,就会导致程序异常终止。可以在代码中添加一些断言语句来检查数组下标是否越界。

    2. 操作空栈:当你在输入数字时,如果栈已经为空,你就无法弹出栈顶元素。这时你可以在代码中添加一些判断语句,避免出现该情况。

    3. 不合法输入:如果用户输入了无法转换为数字的值,如字符串或字母,那么程序就会出错。可以使用异常处理机制来避免程序崩溃,比如捕获输入数据类型不匹配的异常。

    以下是示例代码:

    class Stack:
        def __init__(self, size):
            self.top = -1
            self.max_size = size
            self.data = [None] * size
    
        def is_empty(self):
            return self.top == -1
    
        def is_full(self):
            return self.top == self.max_size - 1
    
        def push(self, value):
            if self.is_full():
                raise Exception('stack is full')
            self.top += 1
            self.data[self.top] = value
    
        def pop(self):
            if self.is_empty():
                raise Exception('stack is empty')
            value = self.data[self.top]
            self.top -= 1
            return value
    
    
    def input_numbers():
        stack = Stack(10)  # 假设栈大小为10
        while True:
            try:
                n = int(input('请输入一个数字:'))
                stack.push(n)
            except ValueError:
                print('输入不合法,请输入数字')
            except Exception as e:
                print(str(e))
            else:
                print('输入成功')
    
    
    if __name__ == '__main__':
        input_numbers()
    

    在上面的示例代码中,我们使用一个Stack类来实现顺序栈,同时在input_numbers函数中添加了异常处理机制,可以避免输入数据类型不匹配、栈满、栈空等情况导致的程序崩溃。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在main中遍历函数后加一个输入字符的函数,问题解决