oiaioiaioiaiaio 2019-10-17 22:59 采纳率: 100%
浏览 338
已采纳

求教大佬!在写顺序栈的作业,显示无错误只有警告,但运行结果为什么这样?

同样的代码我和我同学电脑上运行的结果不一样,我的不断显示线程退出,进程退出。是我的代码错了还是别的问题呢?调试结果如图图片说明图片说明图片说明

    #include <stdio.h>
    #include <malloc.h>
    #include <math.h>
    #include <process.h>
    #include <iostream>
    using namespace std;
    #define Status int
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
        #define OVERFLOW -2
    #define STACK_INIT_SIZE 100    //存储空间初始分配量
    #define STACKINCREMENT 10      //存储空间分配增量
    typedef int SElemType;
    typedef struct {
    SElemType *base;
    SElemType *top;
    int stacksize;
     }SqStack;
    void visit(SElemType &e) {
    printf("%d\n", e);
    }
    //————基本操作的函数原型说明————
    Status InitStack(SqStack &S);
    Status Push(SqStack S, SElemType e);
    Status Pop(SqStack S, SElemType e);
    Status StackTraverse(SqStack S,void(*visit)(SElemType&));
    Status StackEmpty(SqStack S);
    Status InitStack(SqStack &S)
    {//构造一个空栈S
    S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
    if (!S.base) exit (OVERFLOW);//存储分配失败
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
    }//InitStack
    Status Push(SqStack S, SElemType e) {
    //插入新元素e为新的栈顶元素
    if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
        S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if (!S.base)exit(OVERFLOW);//存储分配失败
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top++ = e;
    return OK;
     }//Push
    Status Pop(SqStack S, SElemType e) {
    //若栈不空,则拿出S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
    if (S.top == S.base)return ERROR;
    e = *--S.top;
    return OK;
    }//Pop
     Status StackTraverse(SqStack S,void(*visit)(SElemType&)){
    SElemType* p;
    p=S.base;
    while(S.top>p) visit(*p++);
    return OK;
    }//StackTraverse
    Status StackEmpty(SqStack S){
    if (S.top==S.base) return TRUE;
    return FALSE;
    };//StackEmpty
    int main() {
    SqStack S;
    int i;
    SElemType e;
    InitStack(S);
    Push(S,27);
    Push(S, 927);
    Push(S, 112);
    Push(S, 10);
    Push(S, 25);
    StackTraverse(S,*visit);
    }

  • 写回答

1条回答 默认 最新

  • leishapolang33 2019-10-18 13:50
    关注

    跟栈相关的函数都需要增加上引用。另外需要处理以下值初始化。

    #include <stdio.h>
    #include <malloc.h>
    #include <math.h>
    #include <iostream>
    using namespace std;
    #define Status int
    #define TRUE 1
    #define FALSE 0
    #define OK 1
    #define ERROR 0
    #define INFEASIBLE -1
    #define OVERFLOW -2
    #define STACK_INIT_SIZE 100    //存储空间初始分配量
    #define STACKINCREMENT 10      //存储空间分配增量
    typedef int SElemType;
    struct SqStack{
        SElemType *base;
        SElemType *top;
        int stacksize;
        SqStack():base(nullptr),top(nullptr){
    
        }
        ~SqStack(){
            //destory todo
        }
    };
    void visit(SElemType &e) {
        printf("%d\n", e);
    }
    //————基本操作的函数原型说明————
    Status InitStack(SqStack &S);
    Status Push(SqStack& S, SElemType e);
    Status Pop(SqStack& S, SElemType e);
    Status StackTraverse(SqStack& S,void(*visit)(SElemType&));
    Status StackEmpty(SqStack& S);
    Status InitStack(SqStack &S)
    {//构造一个空栈S
        S.base = (SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));
        if (!S.base) exit (OVERFLOW);//存储分配失败
        S.top = S.base;
        S.stacksize = STACK_INIT_SIZE;
        return OK;
    }//InitStack
    Status Push(SqStack& S, SElemType e) {
        //插入新元素e为新的栈顶元素
        if (S.top - S.base >= S.stacksize) {//栈满,追加存储空间
            S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
            if (!S.base)exit(OVERFLOW);//存储分配失败
            S.top = S.base + S.stacksize;
            S.stacksize += STACKINCREMENT;
        }
        *S.top++ = e;
        return OK;
    }//Push
    Status Pop(SqStack& S, SElemType e) {
        //若栈不空,则拿出S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
        if (S.top == S.base)return ERROR;
        e = *--S.top;
        return OK;
    }//Pop
    Status StackTraverse(SqStack& S,void(*visit)(SElemType&)){
        SElemType* p;
        p=S.base;
        while(S.top>p) visit(*p++);
        return OK;
    }//StackTraverse
    Status StackEmpty(SqStack& S){
        if (S.top==S.base) return TRUE;
        return FALSE;
    };//StackEmpty
    int main() {
        SqStack S;
        int i;
        SElemType e;
        InitStack(S);
        Push(S,27);
        Push(S, 927);
        Push(S, 112);
        Push(S, 10);
        Push(S, 25);
        StackTraverse(S,*visit);
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。