> 文档中心 > 【C语言实现链栈】看完这篇文章,你又进步了

【C语言实现链栈】看完这篇文章,你又进步了

目录

一、基本概念

1.定义

2.优点

二、链栈的表示

 三、链栈的基本操作

 1.创建空链栈

 2.链栈的判空操作

 3.链栈的入栈操作

 4.链栈的出栈操作

 5.取链栈的栈顶元素


一、基本概念

1.定义

栈可以采用链接的方式表示,把栈组织成一个单链表,这种数据结构称为链接栈。即采用链式存储的栈称链栈。

2.优点

便于多个栈共享存储空间和提高效率,且不存在栈上溢的情况 。

二、链栈的表示

类似于单链表,可以把栈直接定义为指向栈结点的指针,这个指针同时也是栈顶指针。

为了强调栈顶是栈的一个属性,对栈进行了封装,引入了LinkStack结构。

typedef int ElemType;struct Node {      //单链表节点定义ElemType data; //数据域struct Node* next;    //指针域};struct LinkStack { //链栈类型定义struct Node* top;};typedef struct LinkStack* PLinkStack; //链栈类型的指针类型

 三、链栈的基本操作

1.创建空链栈

类似于单链表的创建。动态申请一个栈顶结点内存,并使栈顶指针指向空,表示创建的栈为空栈。

PLinkStack CreateLinkStack(void){PLinkStack plstack = (PLinkStack)malloc(sizeof(struct LinkStack));  //申请一个节点空间if (plstack == NULL)  //节点申请失败,返回空指针{return NULL;}plstack->top = NULL;  //申请成功,栈顶指针为空return plstack;//返回空链栈}

 2.链栈的判空操作

栈顶指针指向空,表示栈空。

bool EmptyLinkStack(PLinkStack plstack){return (plstack->top == NULL); //判断栈顶指针是否为空}

 3.链栈的入栈操作

不用担心链栈已满,上溢的问题,因为链表不存在这个问题。

在栈顶插入元素,即在单链表的表头插入元素。动态申请一个结点,存入数据后,插入队头(即单链表的表头),再把栈顶指针指向新插入的结点。

bool Push(PLinkStack plstack, ElemType e){struct Node* p = (struct Node*)malloc(sizeof(struct Node));if (p == NULL)      //申请新节点空间失败{return false;}//不用判断栈是否已满p->data = e;p->next = plstack->top;   //新节点连接到链栈栈顶指针之后,plstack->top = p;  //链栈栈顶指针指向新增节点return true;}

 4.链栈的出栈操作

与入栈操作不同之处在于,链栈的出栈操作需要判断是否栈空(即top == NULL)

栈不空时,先用e存储栈顶元素,再让栈顶指针指向栈中的第二个结点,最后释放第一个结点的内存空间。

bool Pop(PLinkStack plstack, ElemType* e){struct Node* p;if (plstack->top == NULL)  //链栈为空,报错{return false;}*e = plstack->top->data;  //e记录出栈的元素p = plstack->top;  //p指向第一个节点plstack->top = p->next;   //栈顶指针指向第二个接点free(p);    //释放出栈节点的内存空间return true;}

 5.取链栈的栈顶元素

与链栈的出栈操作类似,不同在于不用修改栈顶指针

bool GetTopElem(PLinkStack plstack, ElemType* e){if (plstack->top == NULL)  //链栈为空,报错{return false;}*e = plstack->top->data;   //e记录栈顶的元素return true;}

 The life of a man is the process of trying.

The more one tries, the better his life will be.