链式栈是一种数据存储结构,可以通过单链表的方式来实现,使用链式栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域。
顺序栈存在栈满的情况,适用于数据量较小时,使用不方便,引出链栈,
链栈的最大特点没有满。
链栈的插入和删除
头插和头删:头结点等价于栈的栈顶
尾插和尾删:尾结点等价于栈顶
head.h
#ifndef __LE_H__
#define __LE_H__
#include <stdio.h>
#include <stdlib.h>
typedef int datedef;
typedef struct
{
char name[20];
int age;
int score;
} student;
typedef struct Node
{
union // 数据域
{
int len; // 头结点的数据域 (链表长度)
datedef date; // 其他结点的数据域
};
struct Node *next; // 指针域
} *linkstack, Linkstack;
linkstack creat(int flag); // 创建新链表
int push(linkstack L, datedef s); // 入栈
int pop(linkstack L); // 出栈
void output(linkstack L); // 遍历
void L_free(linkstack L); // 链表释放
#endif
fun.c
#include "head.h"
linkstack creat(int flag) // 创建链表新结点
{
linkstack L = (linkstack)malloc(sizeof(Linkstack));
if (L == NULL)
{
return NULL;
}
if (flag == 1) // 头结点
{
L->len = 0;
}
else if (flag == 0) // 其他结点
{
L->date = 0;
}
L->next = NULL; // 初始化
return L;
}
int push(linkstack L, datedef s) // 入栈
{
if (L == NULL)
{
printf("入栈失败\n");
return -1;
}
linkstack q = creat(0);
if (q == NULL)
{
return -1;
}
q->date = s;
q->next = L->next;
L->next = q;
L->len++;
return 0;
}
void output(linkstack L) // 遍历
{
if (L->next == NULL || L == NULL)
{
printf("遍历失败\n");
}
printf("输出的元素是:\n");
linkstack p = L;
while (p->next)
{
p = p->next;
printf("%d\t", p->date);
}
puts("");
printf("该链栈有%d个元素。\n", L->len);
}
/*
*for(int i=0;i<p->len;i++)
*{
*p=p->next;
*printf("%d\t",p->date);
*}
*puts("");
*/
int pop(linkstack L) // 出栈
{
if (L->next == NULL || L == NULL)
{
printf("出栈失败\n");
return -1;
}
linkstack p = L->next;
printf(" %d 已出栈\n", p->date);
L->next = p->next;
L->len--;
free(p);
p = NULL;
return 0;
}
void L_free(linkstack L) // 链表释放
{
if (L == NULL)
{
return;
}
int n = L->len;
for (int i = 0; i < n; i++)
{
pop(L); // 出栈
}
free(L);
L = NULL;
printf("链栈已释放\n");
}
main.c
#include "head.h"
int main(int argc, const char *argv)
{
linkstack L = creat(1);
int n;
datedef s, e;
printf("你要入栈的元素个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
printf("你要入栈的元素是:");
scanf("%d", &s);
push(L, s); // 入栈
}
output(L);
char c;
while (1)
{
printf("是否出栈?Y/N");
scanf("%c", &c);
puts("");
if (c == 'n' || c == 'N')
{
break;
}
pop(L);
}
output(L);
L_free(L);
}