#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); }
程序运行结果如下:
可以发现,无论是正数还是负数程序都能进行转化。