栈
栈是一种重要的线性结构,是线性表的一种具体形式。
后进先出的(LIFO)的线性表,要求只在末尾进行删除和插入操作
栈的存储结构
最开始栈中不含有任何数据,叫空栈,此时栈顶就是栈底。然后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。
typedef struct { ElemType *base; ElemType *top; int stackSize; }sqStack;
创建栈
#define STACK_INIT_SIZE 100 initStack(sqStack *s) { s->base = (ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType) ); if(!s->base) exit(0); s->top=s->base; s->stackSize = STACK_INTI_SIZE }
入栈
入栈操作又叫压栈操作,就是向栈中存放数据。
入栈操作要在栈顶进行,每次向栈中压入一个数据,top指针就要+1,直到栈满
#define STACKINCREMENT 10 Push(sqStack *s ,ElemType e) { // 如果栈满, 追加空间 if(s->top - s->base >=s->stackSize) { s->base = (ElemType *)realloc(s->base , (s->stackSize + STACKINCREMENT )*sizeof(ElemType)); if(!s->base) exit(0); s->top = s->base +s->stackSize; //设置栈顶 s->stackSize = s->stackSize+STACKINCREMENT; //设置栈的最大容量 } *(s->top)=e; s->top++; }
出栈
出栈操作就是在栈顶取出数据,栈顶指针随之下移的操作
每当从栈内弹出一个数据,栈的当前容量就-1;
Pop(sqStack *s , ElemType e) { if(s->top == s->base) return ; *e =* - - (s->top); }
清空
将栈中的元素全部作废,但栈本身物理空间并不发生改变(并不是销毁)
ClearStack(sqStack *s){ s->top = s-> base; }
销毁
释放掉该栈所占据的物理内存空间
DestroyStack(sqStack *s) { int i , len ; len = s -> stackSize; for(i = 0; i<len ; i++){ free(s->base); s->base++; } s->base = s->top = NULL; s->stackSize= 0; }
栈的容量
当前容量是计算栈中元素的个数 s.top - s.base
最大容量是该栈占据内存空间的大小 其值是s.stackSize
int StackLen(sqStack s) { return (s.top - s.base); //当前容量 }