#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
****************************************************************/