链栈是一种数据存储结构,可以通过单链表的方式来实现,使用链栈的优点在于它能够克服用数组实现的顺序栈空间利用率不高的特点,但是需要为每个栈元素分配额外的指针空间用来存放指针域,使用链栈较顺序栈来说不存在栈满;链栈就是仅在表尾进行插入删除的单链表,插入和删除采用的是头插法
#include<stdio.h>
#include<stdlib.h>
typedef struct StackNode
{
int data;
struct StackNode *next;
}StackNode, *LinkStack;
int InitStack(LinkStack &L)//初始化链栈
{
L = (LinkStack)malloc(sizeof(StackNode));
if (!L)
return 0;
L->next = NULL;
}
int Push_stack(LinkStack &L, int x)//入栈
{
StackNode * p = (LinkStack)malloc(sizeof(StackNode));
if (!p)
{
return 0;
}
p->data = x;//头插法入栈
p->next = L->next;
L->next = p;
}
void traverse(LinkStack L)
{
//遍历栈中元素
int i = 0;
StackNode *p = L->next;
while (p)
{
printf("第%d个元素为%d:\n", ++i, p->data);
p = p->next;
}
}
void Pop_stack(LinkStack &L)
{
StackNode *p = L->next;
L->next = p->next;//让头结点指向出栈元素的下一个位置
free(p);
}
void GetTop(LinkStack L)
{
StackNode *p;
p = L->next;
printf("栈顶元素为%d\n", p->data);
}
int main()
{
LinkStack L;
InitStack(L);
int x;
int i = 0;
for (; i < 5; i++)
{
printf("请输入要入栈的元素");
printf("\n");
scanf_s("%d", &x);
Push_stack(L, x);
}
printf("遍历栈中元素:\n");
traverse(L);
GetTop(L);
printf("出栈:\n");
Pop_stack(L);
traverse(L);
}