目录
简述
链栈是以链式的存储方式存储的线性表, 是栈这一数据结构存储方式的一种。本质是一种只能在一端(即栈顶)进行增,删操作的单链表。
下面我们来详细探讨链栈的基本操作。本文讨论的是无头结点的链栈。
基本操作
结构体构造
typedef struct LinkStackNode{
int data;
LinkStackNode *next;
}LSNode,*LinkStack;
在这段代码中我们定义了名为struct LinkStackNode的结构体, 并使用typedef将其重命名为LSNode和LinkSatck。虽然两者表示的都是统一结构体,但其表示的含义不同。LSNode表示一个节点,而LinkStack则用于表示整个链栈,这样便于在程序中区分。
初始化
void initLinkStack(LinkStack &LS){
LS = NULL;
}
将初始链栈的指针指向NULL
判空
bool empty(LinkStack LS){
if(LS == NULL)
return true;
return false;
}
由于不需要对链栈进行改动,故而无需传入引用
入栈
bool push(LinkStack &LS, int e){
//创建新的节点
LSNode *p = (LSNode*) malloc(sizeof (LSNode));
//分配空间失败, 返回false
if(p == NULL)
return false;
//为节点赋值
p->data = e;
//将节点入栈
p->next = LS;
LS = p;
return true;
}
出栈
bool pop(LinkStack &LS, int &x){
//如果是空栈, 则不能出栈
if(LS == NULL)
return false;
//临时节点, 用于记录栈顶节点地址, 便于回收
LSNode *s = LS;
//记录当前栈顶节点元素
x = LS->data;
//更改栈顶节点
LS = LS->next;
//回收先前栈顶节点
free(s);
return true;
}
此处的判空操作也可以直接调用empty函数
查询栈顶元素
int getTop(LinkStack LS){
//判断是否是空栈
if(empty(LS))
return NULL;
return LS->data;
}
完整程序
#include "cstdio"
#include "cstdlib"
//不带头结点的链栈
typedef struct LinkStackNode{
int data;
LinkStackNode *next;
}LSNode,*LinkStack;
void initLinkStack(LinkStack &LS);
bool empty(LinkStack LS);
bool push(LinkStack &LS, int e);
bool pop(LinkStack &LS, int &x);
void printLinkStack(LinkStack LS);
int getTop(LinkStack LS);
int main(){
LinkStack LS;
initLinkStack(LS);
//接收键入数据
int x;
scanf("%d",&x);
//此处-1为输入结束标志,可任意设定
while(x != -1){
push(LS,x);
scanf("%d",&x);
}
printf("原始链栈为: ");
printLinkStack(LS);
printf("栈顶元素为: %d\n", getTop(LS));
//接收出栈元素
int e;
pop(LS,e);
printf("出栈元素为: %d\n",e);
printf("出栈后链栈为: ");
printLinkStack(LS);
printf("栈顶元素为: %d", getTop(LS));
return 0;
}
//初始化链栈
void initLinkStack(LinkStack &LS){
LS = NULL;
}
//判空
bool empty(LinkStack LS){
if(LS == NULL)
return true;
return false;
}
//入栈
bool push(LinkStack &LS, int e){
//创建新的节点
LSNode *p = (LSNode*) malloc(sizeof (LSNode));
//分配空间失败, 返回false
if(p == NULL)
return false;
//为节点赋值
p->data = e;
//将节点入栈
p->next = LS;
LS = p;
return true;
}
//出栈
bool pop(LinkStack &LS, int &x){
//如果是空栈, 则不能出栈
if(LS == NULL)
return false;
//临时节点, 用于记录栈顶节点地址, 便于回收
LSNode *s = LS;
//记录当前栈顶节点元素
x = LS->data;
//更改栈顶节点
LS = LS->next;
//回收先前栈顶节点
free(s);
return true;
}
//查询栈顶元素
int getTop(LinkStack LS){
//判断是否是空栈
if(empty(LS))
return NULL;
return LS->data;
}
//打印链栈
void printLinkStack(LinkStack LS){
//构建扫描器
LSNode *p = LS;
//遍历链栈, 并从栈顶开始打印链栈元素
while(p != NULL){
printf("%d ",p->data);
p = p->next;
}
//换行
printf("\n");
}
运行结果
文章声明
本文仅为个人学习总结,不做商业用途,在声明来源的前提下欢迎转载学习,如有不足之处敬请指正。