3-栈-顺序存储
笔记
栈是一种先进后出的存储结构
结构示意图
使用顺序存储-数组形式
利用数组来存储栈,数组尾部做栈顶,栈的size记录当前栈内元素个数,也指示当前栈顶在数组的哪个位置。
利用一个结构体来管理栈,成员为size和一个元素为void指针的数组。栈只存储指向数据的指针,所以也要注意数据的作用域。
要实现的接口
初始化、入栈(push)、出栈(pop)、获取栈顶元素、获取栈的大小、销毁栈
代码
myStack.c
#include"myStack.h"
#include<stdlib.h>
#include<string.h>
//建立一个元素为指针的数组,数组尾部做栈顶,减少数据操作
//初始化栈
myStackType* init_stack(){
myStackType* stack = malloc(sizeof(myStackType));
if(NULL == stack){
return NULL;
}
//清零
memset(stack->stack, 0, sizeof(void*)*MAX_LEN);
stack->m_size = 0;
return stack;
}
//入栈
void push_stack(myStackType* st, void* data){
if(NULL == st){
return;
}
if(st->m_size >= MAX_LEN){
return;
}
st->stack[st->m_size] = data;
st->m_size++;
}
//出栈
void pop_stack(myStackType* st){
if(NULL == st){
return;
}
if(st->m_size <= 0){
return;
}
st->stack[st->m_size-1] = NULL;
st->m_size--;
}
//获取栈顶的数据
void* top_stack(myStackType* st){
if(NULL == st){
return NULL;
}
if(st->m_size <= 0){
return NULL;
}
return st->stack[st->m_size - 1];
}
//栈数据大小
int size_stack(myStackType* st){
if(NULL == st){
return 0;
}
return st->m_size;
}
//销毁栈
void destroy_stack(myStackType** st){
free(*st);
*st = NULL;
}
myStack.h
#ifndef __MYSTACK_H
#define __MYSTACK_H
#define MAX_LEN 1024 //这里是固定容量
typedef struct {
void* stack[MAX_LEN];
int m_size;
}myStackType;
myStackType* init_stack();
void push_stack(myStackType* st, void* data);
void pop_stack(myStackType* st);
void* top_stack(myStackType* st);
int size_stack(myStackType* st);
void destroy_stack(myStackType** st);
#endif
start0.c
#include"myStack.h"
#include<stdio.h>
struct Persion{
char m_name[64];
int m_age;
};
int main(){
myStackType* st = init_stack();
struct Persion p1 = {"aaa",10};
struct Persion p2 = {"bbb",20};
struct Persion p3 = {"ccc",30};
push_stack(st,&p1);
push_stack(st,&p2);
push_stack(st,&p3);
printf("size=%d\n",size_stack(st));
while(size_stack(st) > 0){
struct Persion *p0 = top_stack(st);
pop_stack(st);
printf("name=%s\tname=%d\n",p0->m_name, p0->m_age);
}
printf("size=%d\n",size_stack(st));
destroy_stack(&st);
return 0;
}