数据结构实验二:利用栈把十进制数转换为八进制数

时间:2024-03-04 17:37:41
#include<stdio.h>
#include<stdlib.h>
#define ok 1
#define error 0
#define overflow -2
typedef struct
{
    int *base,*top;
    int stacksize;
}sqstack;

int initstack(sqstack *s)
{
    s->base=(int *)malloc(10*sizeof(int));                        //预先为s->base所指向的内存空间分配10个int类型的存储空间
    if(!s->base)return overflow;
    s->top=s->base;
    s->stacksize=10;
    return ok;
}

int gettop(sqstack *s,int *e)
{
    if(s->top==s->base)return error;
    *e=*(s->top-1);
    return ok;
}

int pop(sqstack *s,int *e)
{
    if(s->top==s->base)return error;
    s->top--;
    *e=*s->top;
    return ok;
}

int push(sqstack *s,int e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(int *)realloc(s->base,(s->stacksize+10)*sizeof(int));    //如果栈满,则再次给s->base所指向的内存空间分配10个int类型的存储空间
        if(!s->base)return overflow;
        s->top=s->base+s->stacksize;
        s->stacksize++;
    }
    *s->top=e;
    s->top++;
    return ok;
}

int getlength(sqstack *s)                 //获取栈的长度作为返回值
{
    int i;
    i=s->top-s->base;
    return i;
}

int convertion(int n)                             //传入一个十进制数n,返回值为n的八进制
{
    int k,t,l,m,sum;
    sqstack s;
    initstack(&s);
    do
    {
        k=n%8;
        push(&s,k);
        n/=8;
    }while(n!=0);
    l=getlength(&s);
    for(sum=0;l>0;l--)
    {
        sum*=10;                   //sum*10表示每进行一次循环小数点都向后移动一位,即先出栈的元素位权高
        pop(&s,&m);
        sum+=m;
    }
    return sum;
}

void main()
{
    int i,j;
    printf("请输入一个十进制数:");
    scanf("%d",&j);
    i=convertion(j);
    printf("十进制数%d的八进制为:%d\n",j,i);
}

程序运行结果如下:

可以发现,无论是正数还是负数程序都能进行转化。