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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵