栈是一种重要的数据结构,符合“后进先出”(FILO)的原则。就像向箱子里堆东西一样,后放入的元素需要被先取出来。这篇文章,我将介绍链式栈的创建和基本操作。
①链式栈的实现需要两个结构体:Stack和Node。
(1)Node结构体即为链表的结点,存放data和next指针。Node结构体用来存放数据并组成栈,入栈和出栈都需要借助Node结构体。
(2)Stack结构体即为“栈”的实体,存放栈容量size和top指针。由于这个栈已经借助Node创建好了,我们只需要通过top指针就可以操作栈了。所以top指针就相当于表征了整个栈,存放top指针的结构体我们就视之为“栈”。
struct Node
{
elemtype data;
struct Node* next;
};
struct Stack //结构体Stack存储栈的基本元素:top指针和栈大小size
{
struct Node* top; //栈顶top指针
size_t size; //栈容量
};
②创建结点Node和栈Stack。
(1)传入data并创建单个结点,即为简单的动态内存分配,不做赘述。
(2)创建栈Stack就是创建包含top指针的结构体,也要为其分配空间,同时实现初始化。
typedef Node* PNode;
typedef Stack* PStack;
PNode Create_Node(elemtype x) //创建结点,传入data,返回指向这个节点的指针
{
PNode newnode=(PNode)malloc(sizeof(Node));
newnode->next=NULL;
newnode->data=x;
return newnode;
}
PStack Create_Stack() //创建栈,即创建一个Stack变量,创建即初始化
{
PStack newstack=(PStack)malloc(sizeof(Stack));
newstack->top=NULL;
newstack->size=0;
return newstack;
};
③入栈和出栈。
(1)链式栈的入栈操作:实质上是链表的头插法。首先,我们需要创建出即将插入的结点Node并赋好data的值,这个过程我们已经定义过函数Create_Node(x)了。然后,我们通过top指针的指引将新节点Node插入链表的头部。最后,top指针移位指向栈顶,栈容量size自增。
(2)链式栈的出栈操作:即top指针向后移位,原栈顶元素的空间被释放,栈容量size自减。出栈时需要注意到栈是否为空,如果空栈则不能再出栈。
*这个过程可以表示为下图:
*代码实现:
void Push(elemtype x,PStack L) //入栈:即链表的头插法
{
PNode newnode=Create_Node(x); //创建将要插入的结点
/*头插*/
newnode->next=L->top;
L->top=newnode;
L->size++;
}
void Pop(PStack L) //出栈
{
if (L->size == 0)
{
printf("NULL!Pop Error......\n");
exit(0);
}
else
{
PNode nextnode=L->top->next;
free(L->top);
L->top=nextnode;
L->size--;
}
}
④获取栈顶元素。
即return (L->top->data),通过top指针获取结点Node,在获取data。
elemtype Gettop(PStack L) //获取当前栈顶元素
{
return (L->top->data);
}
完整代码如下:
#ifndef _LWCStack_H_
#define _LWCStack_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef char elemtype;
typedef struct Node* PNode;
typedef struct Stack* PStack;
typedef struct Node Node;
typedef struct Stack Stack;
struct Node
{
elemtype data;
struct Node* next;
};
struct Stack //结构体Stack存储栈的基本元素:top指针和栈大小size
{
struct Node* top; //栈顶top指针
size_t size; //栈容量
};
PNode Create_Node(elemtype x) //创建结点,传入data,返回指向这个节点的指针
{
PNode newnode=(PNode)malloc(sizeof(Node));
newnode->next=NULL;
newnode->data=x;
return newnode;
}
PStack Create_Stack() //创建栈,即创建一个Stack变量,创建即初始化
{
PStack newstack=(PStack)malloc(sizeof(Stack)); //创建栈(结构体)
newstack->top=NULL;
newstack->size=0;
return newstack;
};
void Push(elemtype x,PStack L) //入栈:即链表的头插法
{
PNode newnode=Create_Node(x); //创建将要插入的结点
/*头插*/
newnode->next=L->top;
L->top=newnode;
L->size++;
}
void Pop(PStack L) //出栈
{
if (L->size == 0)
{
printf("NULL!Pop Error......\n");
exit(0);
}
else
{
PNode nextnode=L->top->next;
free(L->top);
L->top=nextnode;
L->size--;
}
}
elemtype Gettop(PStack L) //获取当前栈顶元素
{
return (L->top->data);
}
#endif