任意十进制非负整数转化为八进制

编程知识 更新时间:2023-05-02 21:18:37

NOTICE: 本题代码是按照源码顺序贴上的,复制可直接运行

环境: Visual Stdio Code

题目:

对于输入的任意一个非负十进制整数,算出它的八进制。

说明:

严蔚敏版《数据结构》的第 48 页的算法有个问题:

  出栈的时候必须有取地址符,不然会以一种类似于 copy 的形式出栈。

我稍微改了一下,毕竟书上写的是近似于伪码的算法(只是写个思路嘛,可以理解的)。

代码:

初始化:

#include<stdio.h>
#include<stdlib.h>

#define STACK_INIT_SIZE 10  // 初始分配量
#define STACKINCREMENT 1  // 分配增量
#define OK 1
#define ERROR 0

typedef int Status;
typedef int SElemType;

typedef struct 
{
    SElemType *base;
    SElemType *top;
    int stacksize;;
}SqStack;

Status InitStack(SqStack &S)
{   // 初始化
    S.base = (SElemType *)malloc(STACK_INIT_SIZE *sizeof(SElemType));
    if(!S.base) return ERROR;
    S.top = S.base;
    S.stacksize = STACK_INIT_SIZE;
    return OK;
}//InitStack

销毁:

Status DestroyStack(SqStack &S)
{   // 销毁 
    if(S.base)
    {
        delete S.base;
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
    return OK;
}//DestroyStack

入栈:

Status Push(SqStack &S, SElemType e)
{   // 入栈
    if(S.top - S.base == S.stacksize)
    {
        S.base = (SElemType *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
        if(!S.base) return ERROR;
        S.top = S.base + S.stacksize;
        S.stacksize += STACKINCREMENT;
    }
    *S.top ++= e;
    return OK;
}//Push

出栈:

Status Pop(SqStack &S, SElemType *e)
{   // 出栈
    if(S.top == S.base) return ERROR;
    *e = *--S.top;
    return OK;
}//Pop

判断是否为空栈:

Status StackEmpty(SqStack &S)
{   // 判断是否为空 
    return S.top - S.base == 0;
}//StackEmpty

打印栈:

Status StackTraverse(SqStack &S)
{   // 打印栈
    SElemType *p = (SElemType *)malloc(sizeof(SElemType));
    p = S.top;
    if(!p) return ERROR;
    else
    {
        p--;
        while(p >= S.base)
        {
            printf("%d\t", *p);
            p--;
        }
    }
    return OK;
}//StackTraverse

主函数:

int main()
{
    SqStack S;
    int N;
    SElemType e;
    if(InitStack(S)) printf("\n初始化栈成功!\n");
    printf("\n请输入想要转换的非负十进制整数(以回车键结束):\n");
    scanf("%d", &N);
    getchar();
    while(N)
    {
        Push(S, N %8);
        N = N / 8;
    }
    printf("\n创建好的顺序栈为:\n");
    StackTraverse(S);
    printf("\n该数对应的八进制数为:\n");
    while(!StackEmpty(S))
    {
        Pop(S, &e);  // 出栈时要有取地址符,以确保地址的更新,防止 copy 的出现
        printf("%d", e);    
    }

    return OK;
}

结果示意图:

THE END!

更多推荐

任意十进制非负整数转化为八进制

本文发布于:2023-04-28 17:29:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/32302629e2d0d17619fb3c42e02ae823.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:整数   转化为   十进制非负   八进制

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 109332文章数
  • 27735阅读数
  • 0评论数