#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); }
程序運行結果如下:
可以發現,無論是正數還是負數程序都能進行轉化。