/*函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define STACK_INIT_SIZE 100 //存储空间的初始分配量#define STACKINCREMENT 10 //存储空间的分配增量typedef int Status; typedef int SElemType; //十进制转八进制,栈用于存整数typedef struct { SElemType *base; //栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位}SqStack; //P46页 Status InitStack(SqStack &S) //构造一个空栈,P47页 { 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) free(S.base); S.base=NULL; return OK;}//InitStack Status GetTop(SqStack S,SElemType &e) //若栈非空,用e返回栈顶元素,P47页 { if (S.top == S.base ) return ERROR; e=*(S.top -1); return OK;}//GetTopStatus Pop(SqStack &S,SElemType &e) //若栈非空,出栈,用e返回,P47页{ if (S.top ==S.base ) return ERROR; S.top --; e=*S.top ; return OK; }//PopStatus Push(SqStack &S,SElemType e) //e入栈,P47页 { SElemType * newbase,*p,*q; if (S.top -S.base >=S.stacksize ) //栈满 { S.base=(SElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); //存储分配失败 return ERROR; for(p=newbase,q=S.base;q<S.top;p++,q++) *p=*q; S.base=newbase; S.top=S.base+S.stacksize ; S.stacksize=S.stacksize+STACKINCREMENT; } *S.top ++ = e; return OK;}//PushStatus StackEmpty(SqStack S) //若栈空,返回TRUE,否则返回FALSE{ if (S.top ==S.base ) return TRUE; else return FALSE;}//StackEmptyvoid conversion() //十进制转八进制{ SqStack S; SElemType e; int N; InitStack(S); //初始化空栈 printf("please input a decimal number: "); scanf("%d",&N); //从键盘接收一个十进制的数 while (N) { Push(S,N%8); N=N/8; } while (!StackEmpty(S)) { Pop(S,e); printf("%d",e); } printf("\n"); DestroyStack(S); //销毁栈}//conversionint main() { conversion(); //十进制转八进制 return 0;}