一、背景
栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈)。允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”
特点 :后进先出(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;
}