一、相关概念
1.空增栈
2.空减栈
3.满增栈
4.满减栈
空栈:top指示器,表示的是,新元素待插入的位置
满栈:top指示器,表示的是,最后压栈元素位置
增栈:top指示器,随着元素的插入,top地址慢慢的增加
减栈:top指示器,随着元素的插入,top地址慢慢的减小
linkstack.h
typedef struct{
char name[32];
char sex;
int age;
int score;
}DATATYPE;
typedef struct LinkStackNode {
DATATYPE data;
struct LinkStackNode *next,*prev;
}LinkStackNode;
typedef struct{
LinkStackNode *top;// head
int clen;
}LinkStackList;
1.LinkStackList* CreateLinkStackList();
2.int DestroyLinkStack(LinkStackList*ls);
3.int PushLinkStack(LinkStackList*ls,DATATYPE* data);
4.int PopLinkStack(LinkStackList*ls);
5.int GetSizeLinkStack(LinkStackList*ls);
6.DATATYPE*GetTopLinkStack(LinkStackList*ls);
7.int IsEmptyLinkStack(LinkStackList*ls);
1. CreateLinkStackList 创建链栈表
LinkStackList *CreateLinkStackList() { LinkStackList* ls = (LinkStackList*)malloc(sizeof(LinkStackList)); if (ls == NULL) { perror("CreateLinkStackList malloc fail"); return NULL; } ls->top = NULL; ls->clen = 0; return ls; }
2. DestroyLinkStack 销毁链栈
int DestroyLinkStack(LinkStackList *ls) { int len = GetSizeLinkStack(ls); int i = 0 ; for(i = 0 ;i<len;i++) { PopLinkStack(ls); } free(ls); return 0; }
3. PushLinkStack 入栈,相当于头插
1)先创建一个新结点,把数据data给进新结点,新结点指针next指向NULL;
2)先插入newnode,再改原始的ls->top指向newnode;
int PushLinkStack(LinkStackList *ls, DATATYPE *data) { LinkStackNode* newnode = (LinkStackNode*)malloc(sizeof(LinkStackNode)); if (newnode == NULL) { perror("PushLinkStack malloc fail"); return 1; } memcpy(&newnode->data,data,sizeof(DATATYPE)); newnode->next = NULL; if (IsEmptyLinkStack(ls)) { ls->top = newnode; } else { newnode->next = ls->top; ls->top = newnode; } ls->clen++; return 0; }
4. PopLinkStack 出栈,相当于头删
找一个临时tmp指向要删的结点,将ls->top指向要删的结点的后一个(ls->top->next),释放tmp,即删除tmp结点;
int PopLinkStack(LinkStackList *ls) { if(IsEmptyLinkStack(ls)) { return 1; } LinkStackNode* tmp = ls->top; ls->top = ls->top->next;//==(ls->=tmp->next;) free(tmp); ls->clen--; return 0; }
5. GetSizeLinkStack 获得节点个数
int GetSizeLinkStack(LinkStackList *ls) { return ls->clen; }
6. GetTopLinkStack 获得栈顶元素
DATATYPE *GetTopLinkStack(LinkStackList *ls) { if(IsEmptyLinkStack(ls)) return NULL; return &ls->top->data; }
7.IsEmptyLinkStack 判断链栈空
int IsEmptyLinkStack(LinkStackList *ls) { return 0 == ls->clen; }