1.4栈

栈:后进先出的线性表,要求在表尾进行数据的删除和插入操作、

  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);
	
}

  

拥抱明天! 不给自己做枷锁去限制自己。 别让时代的悲哀,成为你人生的悲哀。
原文地址:https://www.cnblogs.com/dd2hm/p/6845906.html