#pragma once
//---------链表堆栈--------
//说明,带头结点的链表
//链式堆栈所有函数中,没有循环语句,所有操作时间复杂度为 O(1)
#include<stdio.h>//标准输入输出
#include<malloc.h>//malloc()及free()函数
typedef DataType;//需从新定义,如typedef int DataType;
typedef struct snode {
DataType data;
struct snode* next;
}LSNode;
//初始化
//初始化带头结点链式堆栈
void StackInitiate(LSNode** head) {
*head = (LSNode*)malloc(sizeof(LSNode));
(*head)->next = NULL;
}
//非空否
//判断堆栈是否非空,非空返回1,否则返回0
int StackNotEmpty(LSNode* head) {
if (head->next == NULL)
return 0;
else
return 1;
}
//入栈
//把数据元素x插入链式堆栈head的栈顶作为新的栈顶
void StackPush(LSNode* head, DataType x) {
LSNode* p;
p = (LSNode*)malloc(sizeof(LSNode));
p->data = x;
p->next = head->next;//新结点链入栈顶
head->next = p;//新结点成为新的栈顶
}
//出栈
//出栈并把栈顶元素由参数d带回,出栈成功返回1,否则返回0
int StackPop(LSNode* head, DataType* d) {
LSNode* p = head->next;
if (p == NULL) {
printf("堆栈已空出错!");
return 0;
}
head->next = p->next;//删除原栈顶结点
*d = p->data;//原栈顶节点元素赋予d
free(p);//释放原栈顶节点内存空间
return 1;
}
//取栈顶数据元素
//取栈顶元素并把栈顶元素由参数d带回.成功返回1,否则返回0
int StackTop(LSNode* head, DataType* d) {
LSNode* p = head->next;
if (p == NULL) {
printf("栈顶已空出错!");
return 0;
}
*d = p->data;
return 1;
}
//撤销动态申请空间
void Destroy(LSNode* head) {
LSNode* p, * p1;
p = head;
while (p != NULL) {
p1 = p;
p = p->next;
free(p1);
}
}
链式堆栈——全代码+注释
最新推荐文章于 2022-07-19 19:28:08 发布