链栈的建栈,入栈,出栈,取栈顶元素功能实现

目录

一,链栈的定义

二,入栈图解

三,出栈图解

四,完整代码 


一,链栈的定义

      链栈是一种基于链表实现的栈结构,它具有动态分配内存、扩容方便等优点。链栈可以由多个节点组成,每个节点包含一个数据域和一个指向下一节点的指针。与普通的链表不同,链栈只允许在表头进行插入和删除操作,因此对于链栈来说,链表头同时也是栈顶指针。当要将元素压入链栈时,只需新建一个节点,并将该节点加入到链表头即可,取出元素时,则只需获取链表头节点中的数据域,并释放该节点的空间。

二,入栈图解

操作过程:

      ①新开辟一个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;
}

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值