数据结构—栈链表
首先还是简单说一下数据结构的堆栈与C语言里面的区别吧。(ps:这个在学习汇编的时候老师也讲过。忘记了,果然我还是太菜🐔了)
数据结构 | C语言 | |
---|---|---|
一种存储数据的格式 | 内存空间 | |
栈 | 满足先进后出,后进先出的原则 | 为向下增长的,栈中分配局部变量空间 |
堆 | 类似于树一样的结构,根节点的值最小或最大 | 为向上增长的,一般为申请的空间以及静态与全局变量 |
栈:在数据结构中就分为两类,线性栈和链栈,都是遵循一个原则先进后出,不能尾插,一些杂七杂八的不能用罢了,详细的还是请去琢磨书,我就简简单单的说一下了,详细的还是得直接看看书,冲冲冲🚀!详细的还是得直接看看书(Three times!)
/*
* @Description: main.c
* @Author: 小刘
* @Date: 2020-11-22 19:41:25
* @LastEditTime: 2020-11-23 14:37:23
* @LastEditors: 小刘
* @Reference:
*
*/
/*The stack is similar to the linear table, but only part of
*the linear table can be operated!
*/
#include "stacklinklist.h"
#include "stacklinklist.c"
int main(int argc, const char *argv[])
{
int i, j;
LinkStack st;
InitLinkStack(&st); // init stack memory
for (int i = 1; i <= 5; i++)
{
CerateLinkStack(&st, i); //input some element in stack list
}
printf("element");
ShowLinkStack(&st);
i = GetTopLinkStack(&st); // return stack top data
printf("pop: %d\n", i);
j = LinkStackLenght(&st); //return stack length
printf("length: %d\n", j);
PopLinkStack(&st); // output stack top data
ShowLinkStack(&st);
DestoryStackLinke(&st); // free stack memory
ShowLinkStack(&st);
return 0;
}
/*
* @Description: stacklinklist.c
* @Author: 小刘
* @Date: 2020-11-22 19:41:12
* @LastEditTime: 2020-11-23 14:37:03
* @LastEditors: 小刘
* @Reference:
*/
#include "stacklinklist.h"
void InitLinkStack(LinkStack *head)
{
*head = NULL;
}
void CerateLinkStack(LinkStack *head, ElemType num) //LinkStack *s为二级指针
{
StackNode *s = MALLOC(StackNode, 1);
assert(s != NULL);
s->data = num;
if (*head == NULL)
{
*head = s;
s->next = NULL;
}
else
{
s->next = *head;
*head = s;
}
}
void ShowLinkStack(LinkStack *head)
{
StackNode *p = *head;
while (p != NULL)
{
printf(" %d ", p->data);
p = p->next;
}
putchar(10);
}
void PopLinkStack(LinkStack *head)
{
StackNode *s = *head;
(*head) = s->next;
free(s);
s = NULL;
}
int GetTopLinkStack(LinkStack *head)
{
StackNode *s = *head;
return s->data; // error function;
}
int LinkStackLenght(LinkStack *head)
{
int i = 0;
StackNode *s = *head;
while (s != NULL)
{
s = s->next;
i++;
}
return i;
}
void DestoryStackLinke(LinkStack *head)
{ // True way: top->0;
// error function
free(*head);
(*head) = NULL;
}
/*
* @Description: stacklinklist.h
* @Author: 小刘
* @Date: 2020-11-22 19:41:47
* @LastEditTime: 2020-11-23 14:37:32
* @LastEditors: 小刘
* @Reference:
*/
#ifndef __STACKLINKLIST_H
#define __STACKLINKLIST_H
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <assert.h>
#include <string.h>
#define ElemType int
#define MALLOC(type, num) (type *)malloc(sizeof(type) * (num))
typedef struct StackNode
{ //一定要满足stack的规则
//链表的操作有些不能在stack里面用
ElemType data;
struct StackNode *next;
} StackNode;
typedef StackNode *LinkStack;
void InitLinkStack(LinkStack *head);
void CerateLinkStack(LinkStack *head, ElemType num);
void ShowLinkStack(LinkStack *head);
void PopLinkStack(LinkStack *head);
int TopLinkStack(LinkStack *head);
int LinkStackLenght(LinkStack *head);
void DestoryStackLinke(LinkStack *head);
#endif
学的是思想,而非瞎几把操作.最后默默的说一句力扣上面的题目真的是不是人刷的,哭了!