#include <stdio.h> #include <stdlib.h> #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 typedef int Status; #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW 0 // 栈分配溢出 typedef int SElemType; // 定义堆栈元素的类型 typedef struct { SElemType * base; // 在栈构造之前和销毁之后,base的值为NULL SElemType * top; // 栈顶指针 int stacksize; // 当前已分配的存储空间,以元素为单位 }SqStack; Status InitStack(SqStack &S){ // 构造一个空栈 S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base) exit(OVERFLOW); // 存储分配失败 S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }// InitStack Status GetTop(SqStack S, SElemType &e){ // 若栈不空,则用 e 返回 S 的栈顶元素,并返回 OK;否则返回 ERROR if(S.top == S.base) return ERROR; e = *(S.top-1); return OK; }// GetTop Status Push(SqStack &S, SElemType e){ // 插入元素 e 为新的栈顶元素 if(S.top - S.base >= S.stacksize){ //栈满,追加存储空间 S.base = (SElemType *)realloc(S.base, (S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(!S.base) exit(OVERFLOW); // 存储分配失败 S.top = S.base + S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; return OK; } // Push Status Pop(SqStack &S, SElemType &e){ // 若栈不为空,则删除 S 的栈顶元素,用 e 返回其值,并返回 OK;否则返回 ERROR if(S.top == S.base) return ERROR; e = * --S.top; return OK; } // Pop Status StackEmpty(SqStack S){ // 若栈 S 为空栈,则返回 TRUE,否则返回 FALSE return S.top == S.base; } // StackEmpty void conversion(int Num) { // 算法3.1 // 对于输入的任意一个非负十进制整数,打印输出与其等值的八进制数 SElemType e; SqStack S; InitStack(S); // 构造空栈 while (Num) { Push(S, Num % 8); Num = Num / 8; } while (!StackEmpty(S)) { Pop(S, e); printf("%d", e); } printf("\n"); } // conversion int main(){ int num; while(scanf("%d", &num) != EOF){ conversion(num); } return 0; } /************************************************************** Problem: 2142 User: admin Language: C++ Result: Accepted Time:18 ms Memory:1144 kb ****************************************************************/