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 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题
  • ¥15 虚拟机打包apk出现错误
  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝