栈
栈是一种先进后出(LIFO)的数据结构,栈的一个最重要的特征就是只能在栈顶进行入栈和出栈操作。今天我们来讲一下最简单的栈的实现,静态栈的实现,可以把它看作是一个数组,但是这个数组我们只能在它的末尾进行插入和删除操作,是一种受限制的数据结构。
)
栈的线性存储
首先我们来定义一个栈的类型
typedef struct Stack{
int *vect; //元素的存储位置用void *来表示存储的元素可以是任意类型的
size_t size; //栈的大小
size_t cnt; //栈当前元素个数
}Stack;
接下来我们看一下栈的一些操作方法
初始化一个栈
给定一个栈的地址和大小(存储元素个数),可以初始化一个栈
void stack_init(Stack *s,size_t size){
s->vect = malloc(sizeof(int)*size);
s->cnt = 0;
s->size = size;
}
销毁一个栈
void stack_destroy(Stack *s){
free(s->vect);
s->vect = NULL;
}
判断一个栈是否为空
只需要判断里面是否存在元素即可
bool stack_is_empty(Stack *s){
return s->cnt == 0;
}
判断一个栈是否已经满
book stack_is_full(Stack *s){
return s->cnt == s->size;
}
压栈
void stack_push(Stack *s,int data){
s->vect[s->cnt++] = data; //只需要把数据存放在线性表中,
//并且把里面的元素个数+1
}
出栈
int stack_pop(Stack *s){
return s->vect[--s->cnt];
}
查看栈顶元素
和出栈不同,查看栈顶元素不需要对立面的元素进行操作,即不需要让元素个数-1
int top(Stack *s){
return s->vcet[s->cnt-1]
}
遍历栈
遍历栈就和遍历数组一样的操作,无需多言
void foreach(Stack *s,void(*func)(int)){
size_t i;
for(i=0;i<cnt;i++){
func(s->vect[i]);
}
}