this is a 啊哈 2022-10-20 11:57 采纳率: 66.7%
浏览 13
已结题

入栈操作错误关于进制转换问题

问题遇到的现象和发生背景

进制转换

用代码块功能插入代码,请勿粘贴截图

//SqStack.h
#define MAXSIZE 100
#define FALSE 0 //函数结果状态代码
#define TRUE 1
#define OVERFLOW -2
#define OK 1
#define INFEASIBLE -1
#define ERROR 0

typedef int SElemType;
typedef bool Status;
typedef struct{
SElemType *base; //栈底指针
SElemType *top; //栈顶指针
int stacksize; //栈可用最大容量
}SqStack;

Status InitSqStack(SqStack S); //初始化
Status pop(SqStack &S,int &e); //出栈操作
Status Push(SqStack &S,int e); //入栈操作

// SqStack.cpp
#include"SqStack.h"
#include<stdlib.h>
Status InitSqStack(SqStack S) //初始化
{
S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType)); //S.base=new SElemType[MAXSIZE];
if(!S.base) exit(OVERFLOW);
S.base=S.top;
S.stacksize=MAXSIZE;
return OK;
}

Status Push(SqStack &S,int e) //入栈操作
{ if(S.top-S.base==S.stacksize) //栈满
return ERROR;
else
*S.top++=e;
return OK;
}

Status pop(SqStack &S,int &e) //出栈操作
{
if(S.top==S.base) //栈空
return ERROR;
else
e=*--S.top;
return OK;
}

//main.cpp
#include<stdio.h>
#include"SqStack.h"
int main()
{ int N,d,i=0,j,e;
SqStack S;
if(InitSqStack(S))
printf("初始化成功!\n");
else
printf("初始化失败!\n");
printf("十进制数N=");scanf("%d",&N);printf("\n");
printf("要转换的进制d=");scanf("%d",&d);printf("\n");
while(N)
{
Push(S,N%d);
++i;
N=N/d;
}
for(j=i;j>=1;j--)
{
pop(S,e);
printf("%d转换为%d进制=%d",N,d,e);
}
return 0;
}

运行结果及报错内容

img

我想要达到的结果

运行那个Push函数

  • 写回答

1条回答 默认 最新

  • wwc2017 2022-10-20 14:38
    关注

    这个问题用开发环境自带的调试功能就能定位是哪一行代码导致程序崩溃。
    我用的是vscode,如下图

    img

    原因在于S.top没有初始化

    Status InitSqStack(SqStack S) //初始化
    {
        S.base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType)); //S.base=new SElemType[MAXSIZE];
        if(!S.base) exit(OVERFLOW);
        S.base=S.top;
        S.stacksize=MAXSIZE;
        return OK;
    }
    
    

    S.base=S.top;这句写反了,应该是S.top = S.base;
    但这还有一个问题,这里的S是形参,改变形参并不能改变传入函数的实参,所以InitSqStack这个函数实际并没有起到任何作用。
    因为我看到你代码里有#include <stdio.h>头文件,推测你用的是C语言而不是C++,所以InitSqStack函数的参数应改为指针

    Status InitSqStack(SqStack *pS) //初始化
    {
        pS->base=(SElemType*)malloc(MAXSIZE*sizeof(SElemType)); //pS->base=new SElemType[MAXSIZE];
        if(!pS->base) exit(OVERFLOW);
        pS->base = pS->top;
        pS->stacksize=MAXSIZE;
        return OK;
    }
    
    

    调用InitSqStack处改为

    if(InitSqStack(&S))
    
    

    另外程序应该还有其他问题,因为我测试了一下,计算结果并不正确。不过还是你自己先尝试解决更有助于学习

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月29日
  • 已采纳回答 10月21日
  • 创建了问题 10月20日

悬赏问题

  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000