目录
一,链栈的定义
链栈是一种基于链表实现的栈结构,它具有动态分配内存、扩容方便等优点。链栈可以由多个节点组成,每个节点包含一个数据域和一个指向下一节点的指针。与普通的链表不同,链栈只允许在表头进行插入和删除操作,因此对于链栈来说,链表头同时也是栈顶指针。当要将元素压入链栈时,只需新建一个节点,并将该节点加入到链表头即可,取出元素时,则只需获取链表头节点中的数据域,并释放该节点的空间。
二,入栈图解
操作过程:
①新开辟一个p结点,把要入栈的数值赋给p的数据域。
②将新节点的指针域指向链表头结点(p->next = S),即当前的栈顶指针。
③将栈顶指针指向新结点,使得新结点成为新的栈顶元素。
void pushstack(int e)
{
linkstack* p;
p = (linkstack*)malloc(sizeof(linkstack));
p->data = e;
p->next = S;
S = p;
printf("%d入栈成功!\n", e);
}
三,出栈图解
操作过程:
①检查链栈是否为空,为空则无法再出栈。
②如果链栈非空,新开辟一个结点指向栈顶指针,并将栈顶指针指向下一个结点。
③删除新开辟的结点。
void popstack()
{
linkstack* p;
p = (linkstack*)malloc(sizeof(linkstack));
if (S == NULL)
{
printf("栈空!");
exit(1);
}
p = S;
printf("%d出栈成功!\n", p->data);
S = S->next;
free(p);
}
四,完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef struct linkstack
{
int data;
struct linkstack* next;
}linkstack;
linkstack* S;
void creatstack()
{
S = (linkstack*)malloc(sizeof(linkstack));
S = NULL;
printf("创建链栈成功!\n");
}
void pushstack(int e)
{
linkstack* p;
p = (linkstack*)malloc(sizeof(linkstack));
p->data = e;
p->next = S;
S = p;
printf("%d入栈成功!\n", e);
}
void popstack()
{
linkstack* p;
p = (linkstack*)malloc(sizeof(linkstack));
if (S == NULL)
{
printf("栈空!");
exit(1);
}
p = S;
printf("%d出栈成功!\n", p->data);
S = S->next;
free(p);
}
void gettop()
{
if (S == NULL)
{
printf("栈空!");
exit(1);
}
else
printf("栈顶元素为:%d\n", S->data);
}
void menu()
{
printf("******************************************************\n");
printf("********** 请输入你的选择 ***********\n");
printf("********** 1 ---- 创建链栈 ***********\n");
printf("********** 2 ---- 入栈 ***********\n");
printf("********** 3 ---- 出栈 ***********\n");
printf("********** 4 ---- 取栈顶元素 ***********\n");
printf("******************************************************\n");
}
int main()
{
int choice, e;
menu();
while (1)
{
printf("请选择功能:");
scanf("%d", &choice);
switch (choice)
{
case 1:
creatstack();
break;
case 2:
printf("请输入需要入栈的数:");
scanf("%d", &e);
pushstack(e);
break;
case 3:
popstack();
break;
case 4:
gettop();
break;
}
}
return 0;
}