#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACK_ADD_SIZE 10 //存储空间分配增量
typedef struct {
int *base;
int *top;
int stacksize; //当前可用最大容量
} SqStack;
void conversion(int i);
//初始化时不限定栈的最大容量,可以设定某一大小,不够再扩容
void InitStack(SqStack *S);
void DestoryStack(SqStack *S);
void PushStack(SqStack *S, int e);
void PopStack(SqStack *S, int e);
void ClearStack(SqStack *S);
int StackEmpty(SqStack S);
int StackLength(SqStack S);
int GetTop(SqStack S); //取得栈顶元素
void StackTraverse(SqStack S, int(*Visit)(int));
void InitStack(SqStack *S) { //S是二级指针 形参是二级指针
(*S).base = (int *)malloc(sizeof(int) * STACK_INIT_SIZE);
if (!S->base)
return;
(*S).top = (*S).base;
(*S).stacksize = STACK_INIT_SIZE;
}
int StackEmpty(SqStack S) {
if (S.base == S.top)
return 1;
return 0;
}
int GetTop(SqStack S) {
//若栈不为空
if (S.base == S.top)
return 0;
return *(S.top - 1);
}
void DestoryStack(SqStack *S) {
free((*S).base); //释放栈底指针
(*S).base = NULL;
(*S).top = NULL;
(*S).stacksize = 0;
}
void PushStack(SqStack *S, int e) {
//判断栈是否满 栈底指针-栈顶指针
//栈满扩容,不满添加元素
if ((*S).base - (*S).top >= (*S).stacksize) {
(*S).base = (int *)realloc((*S).base, sizeof(int) * STACK_ADD_SIZE);
if (!(*S).base)
return;
(*S).top = (*S).base + (*S).stacksize; //一级指针是栈本生
(*S).stacksize += STACK_ADD_SIZE;
}
/*
*(S->top) = e;
S->top++;*/ //二级指针是栈
*((*S).top) = e;
(*S).top++;
}
void PopStack(SqStack *S, int *e) {
if ((*S).base == (*S).top)
return;
(*S).top--;
*e = *((*S).top);
}
void StackTraverse(SqStack S, void(*Visit)(int)) {
int *temp = S.base;
while (temp < S.top)
Visit(*temp++);
printf("\n");
}
void visit(int e) {
printf("%d", e);
}
void conversion(int i) {
//余数入栈
//在除以8
SqStack S;
int e;
InitStack(&S);
while (i) {
PushStack(&S, i % 8);
i = i / 8;
}
while (!StackEmpty(S)) {
PopStack(&S, &e);
printf("%d", e);
}
}
int main() {
SqStack S;
InitStack(&S);
int elem = 3;
for (int i = 0; i < 6; i++) {
PushStack(&S, i);
}
StackTraverse(S, visit);
PopStack(&S, &elem);
StackTraverse(S, visit);
conversion(786);
return 0;
}