。lu。。 2022-10-21 23:17 采纳率: 66.7%
浏览 8

C的数据结构,栈转化10进制总是报空,代码不知道哪里出错啦,各位办一下忙

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

C的数据结构,栈转化10进制总是报空,代码不知道哪里出错啦,麻烦各位办一下忙

用代码块功能插入代码,请勿粘贴截图
#include<iostream>
using namespace std;
//顺序栈结构体类型定义
typedef int SElemType;
const int STACK_INIT_SIZE = 100;
typedef struct {
    SElemType* base;
    SElemType* top;
    int stacksize;
}sqstack;
//初始化顺序栈
void init_stack(sqstack& s) {
    s.base = new SElemType[STACK_INIT_SIZE];
    if (!s.base)
        exit(-1);
    s.top = s.base;
    s.stacksize = STACK_INIT_SIZE;
}
//判断栈满
int stack_full(sqstack s) {
    if (s.top - s.base >= s.stacksize)
        return 1;
    else
        return 0;
}
//判断栈空
int stack_empty(sqstack s) {
    if (s.base = s.top)
        return 1;
    else
        return 0;
}
//入栈
void push_satck_sq(sqstack& s, SElemType x) {
    if (stack_full(s))
        cout << "The stack is full !" << endl;
    else *s.top++ = x;
}
//出栈
int pop_stack_sq(sqstack& s, SElemType& x) {
    if (stack_empty(s))
    {
        cout << "The satck is empty !" << endl;
        return 0;
    }
    else
        x = *(--s.top);
    return x;
}
//获得栈顶元素
SElemType gettop_sq(sqstack s) {
    if (stack_empty(s))
        cout << "The stack is empty !";
    else
        return *(s.top - 1);
}
//输出栈中元素
void printstack_sq(sqstack s) {
    sqstack p = s;
    if (stack_empty(p))
        cout << "The stack is empty !" << endl;
    else
    {
        while (!stack_empty(p))
        {
            cout << gettop_sq(p) << "  ";
            p.top--;
        }
    }
}

void main(){
    sqstack s;
    init_stack(s);
    int a, b;
    cout << "请输入你要转换的十进制数" << endl;
    cin >> a;
    if (a != 0)
    {
        cout << "请输入你要转换的进制(最多支持16进制)" << endl;
        cin >> b;
        while (b > 16 || b < 0)
        {
            cout << "请输入正确的进制数(请输入你要转换的进制(最多支持16进制))" << endl;
            cin >> b;
        }
        while (a != 0)
        {
            push_satck_sq(s, a % b);
            a = a / b;
        }
        printstack_sq(s);
    }
    else cout << "输出完成" << endl;
}

运行结果及报错内容

img

我想要达到的结果

运行正常

  • 写回答

1条回答 默认 最新

  • bostonAlen 2022-10-22 02:33
    关注

    你的误区在于你这里定义的数据结构sqstack根本不是一个栈,你想一下,栈是一个能放进去多个元素的结构,那么你这里用什么来放元素呢。你这里定义的sqstack到底是什么,你这个结构体说白了就是三个int变量,而不是一个能存储多个数据的结构,无法表示成一个栈。另外你这里使用分配空间时使用数组,那么你要知道top和base就是栈的下标,而不是元素。你需要在这里面放一个数组来存储元素,而栈只是改变这些元素的位置关系而已。
    象这样,把下标0作为栈底,定义top栈顶,然后data是存放数据的空间。

    struct                       //定义栈的结构体
    {
        int data[MAXSIZE];
        int top;
    }Stack
    
    

    下面代码使用纯c,仅供参考

    #define _CRT_SECURE_NO_WARNINGS
    
    #include<stdio.h>
    #include<stdlib.h>
    
    #define MAXSIZE 100
    typedef struct                       //定义栈的结构体
    {
        int data[MAXSIZE];
        int top;
    }Stack, *pStack;
    
    //栈的初始化
    void s_init(pStack& S)
    {
        S = (pStack)malloc(sizeof(Stack));
        if (S)
            S->top = -1;
    }
    //入栈函数
    void s_push(pStack& S, int x)
    {
        S->top++;
        S->data[S->top] = x;
    }
    //出栈函数
    void s_pop(pStack& S)
    {
        while (S->top != -1)
        {
            printf("%d", S->data[S->top]);
            S->top--;
        }
    }
    //进制转换函数
    void zhuanhua(int m, int n, pStack& S)
    {
        /*进制转换基本原理
        一直整除直至结果为0
        将余数push到栈中*/
        int k=0;
        while (m != 0)
        {
            k = m % n;
            s_push(S, k);
            m = m / n;
        }
    }
    //栈销毁函数
    void s_delete(pStack& S)
    {
        if (S)
            free(S);
        S = NULL;
    }
    
    int main()
    {
        //初始化栈
        pStack S;
        s_init(S);
    
        //输入十进制数
        int a, b;
        printf("请输入你要转换的十进制数:");
        scanf("%d", &a);
    
        //如果输入的数是0,则输出提示退出
        if (a == 0)
        {
            printf("0就是0,无需转换\n");
            exit(0);
        }
        //否则
        else
        {
            //使用goto语句,如果输入的进制数不是1-16进制则重复执行
            shurujinzhi:
            printf("请输入你要转换的进制(最多支持16进制):");
            scanf("%d", &b);
            while (b > 16 || b < 0)
            {
                printf("请输入正确的进制数(请输入你要转换的进制(最多支持16进制)):");
                goto shurujinzhi;
            }
    
            //进行转换,将转换完的结果保存到S
            zhuanhua(a, b, S);
    
            //出栈
            s_pop(S);
    
            //销毁栈
            s_delete(S);
        }
        return 0;
    }
    
    评论

报告相同问题?

问题事件

  • 创建了问题 10月21日

悬赏问题

  • ¥15 matlab数据降噪处理,提高数据的可信度,确保峰值信号的不损失?
  • ¥15 怎么看我在bios每次修改的日志
  • ¥15 python+mysql图书管理系统
  • ¥15 Questasim Error: (vcom-13)
  • ¥15 船舶旋回实验matlab
  • ¥30 SQL 数组,游标,递归覆盖原值
  • ¥15 为什么我的数据接收的那么慢呀有没有完整的 hal 库并 代码呀有的话能不能发我一份并且我用 printf 函数显示处理之后的数据,用 debug 就不能运行了呢
  • ¥20 gitlab 中文路径,无法下载
  • ¥15 用动态规划算法均分纸牌
  • ¥30 udp socket,bind 0.0.0.0 ,如何自动选取用户访问的服务器IP来回复数据