栈的顺序存储表示
#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 //存储空间分配增量 //Status是函数的类型,其值是函数结果状态代码 typedef int Status; typedef int SElemType; #include "malloc.h" typedef struct{ SElemType *base; //在栈构造之前和销毁之后,base的值为NULL SElemType *top; //栈顶指针 int stacksize; //当前已分配的存储空间,以元素为单位 }SqStack; //-------基本操作的函数原型说明------------- Status InitStack(SqStack &S); //构造一个空栈S Status DestroyStack(SqStack &S); //销毁栈S,S不再存在 Status ClearStack(SqStack &S); //把S置为空栈 Status StackEmpty(SqStack S); //若栈S为空栈,则返回TRUE,否则返回FALSE int StackLength(SqStack S); //返回S的元素个数,即栈的长度 Status GetTop(SqStack S,SElemType &e); //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR Status Push(SqStack &S,SElemType e); //插入元素e为新的栈顶元素 Status Pop(SqStack &S,SElemType &e); //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR Status StackTraverse(SqStack S,Status (*visit)()); //从栈底到栈顶依次对栈中的每个元素调用函数visit()。一旦visit()失败,则操作失败 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){ if(S.top==S.base) return ERROR; e=*(S.top-1); return OK; }//GetTop Status Push(SqStack &S,SElemType 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){ if(S.top==S.base) return ERROR; e=*--S.top; return OK; }//Pop Status StackEmpty(SqStack S){ if(S.top==S.base) return TRUE; return FALSE; }//StackEmpty
#include "stdafx.h" #include "stdlib.h" #include "stdio.h" #include "SqStack.h" void conversion(){ SqStack S; SElemType e; int N; InitStack(S); scanf("%d",&N); while(N){ Push(S,N%8); N=N/8; } while(!StackEmpty(S)){ Pop(S,e); printf("%d",e); } } int main(int argc, char* argv[]) { conversion(); return 0; }