用栈的思想实现数制转换(十进制->八进制)

十进制和其他d进制数的转换是计算机实现计算的基本问题,其中一个简单算法基于下列原理:
N=(N div d)*d+N mod d(div 为整除运算,mod为求余运算)

下列代码用栈的思想(先进后出)实现数制转换,不足之处是:

  • 仅仅是用代码实现功能;
  • 代码没有优化;
  • 中间“注释”太多。

参考代码:

#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define NO 0
#define ADD_SIZE 20
#define INIT_SIZE 10
typedef int Status;
typedef struct /*类型定义,定义了一个SqStack类型,可以用它来定义一个变量*/
{
    int *top;
    int *base;
    int stacksize;
}SqStack;
Status InitStack(SqStack *S)
{   /*分配内存,如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。*/
    S->base=(int *)malloc(INIT_SIZE*sizeof(int));
    if(!S->base)
        printf("ERROR!\n");
    S->top=S->base;
    S->stacksize=INIT_SIZE;
    return OK;
}
Status Push(SqStack *S,int e)
{
    if(S->top-S->base>=S->stacksize)/*两个指针的差是中间元素的个数*/
    {
        S->base=(int *)malloc((INIT_SIZE+ADD_SIZE)*sizeof(int));
        if(!S->base)
            printf("ERROR!\n");
        S->top=S->base+S->stacksize;
        S->stacksize+=ADD_SIZE;
    }
    *S->top++=e;//先把e给当前指针所指的位置,然后指针+1
    return OK;
}
Status Pop(SqStack *S)//直接在原结构体上操作
{
    int e;
    e=*--S->top;//指针先减1,再把它的值赋给e
    return e;
}
int main()
{
    int N;//输入
    int m;//N%8  m先入栈,最后出栈
    int out_stack_value;
    SqStack S;
    InitStack(&S);
    scanf("%d",&N);
    while(N!=0)
    {   
        m=N%8;//余数,进栈
        Push(&S,m);
        N=N/8;
    }
    while(S.top-S.base>0)
    {
        out_stack_value=Pop(&S);//出栈值
        printf("%d",out_stack_value);//传递的是原结构体的地址  
    }
    printf("\n");
    return 0;
}

运行输出:

这里写图片描述

发布了8 篇原创文章 · 获赞 4 · 访问量 1408

猜你喜欢

转载自blog.csdn.net/sinat_28995767/article/details/52179204