链栈的基本操作
用链表实现一个栈
具体实现
定义一个链栈
//定义一个链栈
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkStack;
初始化
//初始化链栈
void InitStack(LinkStack* S) {
//创建头结点
*S = (LinkStack)malloc(sizeof(LNode));
if (!*S) {
exit(0);
}
(*S)->next = NULL;
}
入栈操作
//入栈操作
void Push(LinkStack* S, int e) {
LinkStack p = (LinkStack)malloc(sizeof(LNode));
if (!p) {
exit(0);
}
p->data = e;
p->next = (*S)->next;
(*S)->next = p;
}
出栈操作
//出栈操作
int Pop(LinkStack* S) {
//判断是否为空
if ((*S)->next == NULL) {
printf("栈为空\n");
return 0;
}
LinkStack p = (*S)->next;
(*S)->next = p->next;
int e = p->data;
free(p);
return e;
}
销毁链栈
//销毁链栈
void Destroy(LinkStack* L) {
LinkStack q = *L;
while (*L != NULL) {
q = q->next;
free(*L);
*L = q;
}
}
求链栈的长度
//求栈的长度
int Length(LinkStack L) {
int count = 0;
while (L->next != NULL) {
++count;
L = L->next;
}
return count;
}
测试
#include <stdio.h>
#include <windows.h>
//定义一个链栈
typedef struct LNode {
int data;
struct LNode* next;
}LNode, *LinkStack;
//初始化链栈
void InitStack(LinkStack* S) {
//创建头结点
*S = (LinkStack)malloc(sizeof(LNode));
if (!*S) {
exit(0);
}
(*S)->next = NULL;
}
//入栈操作
void Push(LinkStack* S, int e) {
LinkStack p = (LinkStack)malloc(sizeof(LNode));
if (!p) {
exit(0);
}
p->data = e;
p->next = (*S)->next;
(*S)->next = p;
}
//出栈操作
int Pop(LinkStack* S) {
//判断是否为空
if ((*S)->next == NULL) {
printf("栈为空\n");
return 0;
}
LinkStack p = (*S)->next;
(*S)->next = p->next;
int e = p->data;
free(p);
return e;
}
//销毁链栈
void Destroy(LinkStack* L) {
LinkStack q = *L;
while (*L != NULL) {
q = q->next;
free(*L);
*L = q;
}
}
//求栈的长度
int Length(LinkStack L) {
int count = 0;
while (L->next != NULL) {
++count;
L = L->next;
}
return count;
}
int main() {
LinkStack s1;
InitStack(&s1);
for (int i = 0; i < 5; ++i) {
Push(&s1, i + 1);
}
printf("%d\n", Length(s1));
for (int i = 0; i < 5; ++i) {
printf("%d ", Pop(&s1));
}
printf("\n");
printf("%d\n", Length(s1));
Destroy(&s1);
if (!s1) {
printf("OK\n");
}
system("pause");
return 0;
}
效果图
希望该文章能对大家有所帮助
同时真诚接受大家宝贵的评论和建议