栈:后进先出的线性表,要求在表尾进行数据的删除和插入操作、
1)栈的元素必须先进后出
2)栈的操作只能限定在这个顺序表的表尾进行。
对于栈,这个顺序表或者链表的表尾(进行删除和插入的地方)称为栈顶top,相应的表头称为栈底bottom、
定义一个顺序栈:
typedef struct{ ElemType *base;//指向栈底的指针变量 ElemType *top; //指向栈顶的指针变量 int stacksize;//栈的当前可使用的最大容量 }sqStack;
创建一个空栈
#define STACK_INIT_SIZE 100 initStack(sqStack *s){ //内存中开辟一段连续空间作为栈空间,首地址赋值给s->base s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); if(!s->base) exit(0); //分配空间失败 s->top = s->base; //最开始,栈顶就是栈底,此时为空栈 s->stacksize = STACK_INIT_SIZE; }
入栈
#define STACKINCREMENT 10 Push(sqStack *s,ElemType e){ if(s->top - s->base >= s->stacksize) { //判断栈是否满
//如果栈满,通过realloc()函数追加空间 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++; }
注意:top指向的空间始终为栈顶元素的上一个空间。
出栈:
Push(sqStack *s,ElemType e){ if(s->top = s->base ) return; *e = *--(s->top);//先将指针减一,再取出指针指向的内容,赋值给e }
清空栈:希望将栈中元素全部作废,而栈本身的物理空间并不一定发生改变。
ClearStack(sqStack *s) { s->top = s->base; }
销毁一个栈:释放掉该栈所占据的物理内存空间。
DestroyStack(sqStack *s){ free(s->base); s->base = s->top =NULL; s->stacksize = 0; }
计算栈的当前容量
int StackLen(sqStack *s){ return (s->base - s->top); }