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 PFENet的预训练权重
  • ¥15 程序哪有错误怎么改?
  • ¥15 交换机和交换机之间的链路带宽以及主机带宽的理解
  • ¥15 ai创想家对战模式代码
  • ¥15 集合A由3个2行4列二维数组构成,从集合A中任意取一个二维数组元素、如果该二维数组元素的对应列位置的上、下两数都是奇数,而且仅有2个列是奇数/奇数,则该数组有意义,并放入集合B中打印输出。
  • ¥15 电信IPV6 无法外网访问吗
  • ¥15 有偿求效果比较好的遥感影像匹配的c++代码
  • ¥15 博主,你好,我下载了你的智能网联汽车辅助驾驶安全信息检测系统,现在不会运行,可以教我吗,
  • ¥15 怎么在excle输入下列公式
  • ¥15 Arduino,利用modbus的RS485协议,进行对外置的温湿度传感器进行数据读取