一、背景

栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)。允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”

特点 :后进先出(LIFO)。 

 

 

顺序栈 :
它是顺序表的一种,具有顺序表同样的存储结构,由数组定义,配合用数组下标表示的栈顶指针top(相对指针)完成各种操作。

 

 

二、顺序栈的数据结构

   typedef  int  data_t ;		/*定义栈中数据元素的数据类型*/
   typedef struct 
   {	
         data_t  *data ; 	               /*用指针指向栈的存储空间*/
         int  maxlen;		/*当前栈的最大元素个数*/
	 int  top ; 			/*指示栈顶位置(数组下标)的变量*/
   } seqstack_t; 			/*顺序栈类型定义*/

 

三、顺序栈的相关操作

1.创建一个栈

sqstack* stack_create(int len)
{
	sqstack *s;

	if((s=(sqstack *)malloc(sizeof(sqstack)))==NULL)
	{
		puts("malloc failed");
		return NULL;
	}
	if((s->data=(datatype *)malloc(len*sizeof(datatype)))==NULL)
		
	{
		puts("malloc failed");
		return NULL;
	}
	s->maxlen=len;
	s->top=-1;

	return s;
}

 

2.将一个元素压入(push)栈

int stack_push(sqstack* s,datatype value)
{
	if(s->top==s->maxlen-1){
		puts("stack is full");
		return -1;
	}

	s->data[s->top+1]=value;
	s->top++;

	return 1;
}

 

3.将一个元素从栈中弹出

datatype stack_pop(sqstack* s)
{
	s->top--;
	return s->data[s->top+1];
}

 

4.释放栈

void stack_free(sqstack *s)
{
	free(s->data);
	s->data=NULL;

	free(s);
	s=NULL;
}

 

5.其他操作(判断栈空、判断栈满、清空栈)

//判断栈是否为空
int stack_empty(sqstack* s)   
{
	return (s->top==-1 ? 1:0);
}

//判断栈是否为满
int stack_full(sqstack* s)
{
	return (s->top==(s->maxlen-1) ? 1:0);
}

//清空栈中的元素
void stack_clear(sqstack* s)
{
	s->top = -1;
}