当前位置: 首页 > news >正文

C语言:基于链表实现栈

定义:

栈(stack)是一种遵循先入后出逻辑的线性数据结构。

    把栈顶部称为“栈顶”,底部称为“栈底”。将把元素添加到栈顶的操作叫作“入栈”,删除栈顶元素的操作叫作“出栈”。

分析:

栈的常用操作有:

        1. 入栈;

        2. 出栈;

        3. 获取栈顶元素;

        4. 获取栈大小;

        5. 删除栈。

下面,采用链表结构实现栈:

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

//链表
typedef struct ListNode 
{
	int data;
	ListNode *next;
};

//基于链表实现的栈
typedef struct StackNode
{
	ListNode *top;
	int size;
}LinkListStack;

//栈初始化(构造函数)
LinkListStack *creatLinkListStack()
{
	LinkListStack *s = (LinkListStack *) malloc(sizeof(LinkListStack));
	s->top = NULL;
	s->size = 0;
	return s;
}

//析构函数,删除栈
void delLinkedListStack(LinkListStack *s)
{
	while(s->top){
		ListNode *n = s->top->next;
		free(s->top);
		s->top = n;
	}
	free(s);
	printf("栈已删除\n");
}

//获取栈的长度
int getSize(LinkListStack *s)
{
	return s->size;
}

//判断栈是否为空
bool isEmpty(LinkListStack *s)
{
	return getSize(s)==0;
}

//入栈
void push(LinkListStack *s,int num)
{
	ListNode *node = (ListNode *)malloc(sizeof(ListNode));
	node->next = s->top;
	node->data = num;
	s->top = node;
	s->size++;
}

//访问栈顶元素
int gettop(LinkListStack *s)
{
	if(s->size == 0)
	{
		printf("栈为空\n");
		return INT_MAX;
	}
	return s->top->data;
}

//出栈
int pop(LinkListStack *s)
{
	int e = gettop(s);

	ListNode *temp = s->top;
	s->top=s->top->next;

	free(temp);
	temp=NULL;

	s->size--;
	return e;
}

//打印栈
void Print_Stack(LinkListStack *s)
{
	if(s==NULL)
	{
		printf("栈已删除\n");
		return ;
	}
	else
	{
		ListNode *p = s->top;
		printf("\n栈中元素为:\n");
		while(p)
		{
			printf("\t%d\n",p->data);
			p=p->next;
		}
		printf("****************\n");
	}
}

int main(){
	LinkListStack *Stack = creatLinkListStack();
	int num;
	char op[10];
	while(scanf("%s",op)!=EOF)
	{
		//入栈测试
		if(strcmp(op,"push")==0)
		{
			scanf("%d",&num);
			push(Stack,num);
		}
		//出栈测试
		else if(strcmp(op,"pop")==0)
		{
			num=pop(Stack);
		}
		//打印栈
		else if(strcmp(op,"show")==0)
		{
			Print_Stack(Stack);
		}
		//删除栈
		else if(strcmp(op,"delete")==0)
		{
			delLinkedListStack(Stack);
		}
		//获取栈顶元素
		else if(strcmp(op,"top")==0)
		{
			num = gettop(Stack);
			printf("%d\n",num);
			printf("****************\n");
		}
	}
	return 0;
}

测试:

输入:

push 1

push 4

push 3

push 5

show

pop

show

pop

show

top

delete

输出:

栈中元素为:
        5
        3
        4
        1
****************

栈中元素为:
        3
        4
        1
****************

栈中元素为:
        4
        1
****************
4
****************

栈已删除

相关文章:

  • java多线程基础
  • 深入解析 Vue 3 Teleport:原理、应用与最佳实践
  • MySQL基本语句以及表约束练习
  • 单口路由器多拨号ADSL实现方法
  • Flutter小白开发笔记
  • 自动化测试框架学习总结-hytest学习
  • OpenEuler20.3 安装 Elasticsearch7.17
  • 关于新奇的css
  • IDEA:项目结构不见了,项目文件消失解决
  • FastDVDnet:不需要显示学习运动的实时视频降噪
  • AI编写自动化测试脚本
  • 淘宝API vs 爬虫:合规获取实时商品数据的成本与效率对比
  • 对比文章相似度的余弦相似度算法的原理
  • Redis持久化深度解析:RDB与AOF双剑合璧
  • 【已解决】docker: Error response from daemon: Get “https://registry-1.docker.io/v2/“: net/http: request c
  • 【eNSP实战】将路由器配置为DHCP服务器
  • 3、数据库的基础学习 下
  • Vue.js常见问题及解决方案
  • JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal
  • 利用Java爬虫根据关键词获取商品列表:实战指南
  • 广东:十年后省级水网主骨架全面建成,与国家骨干网互联互通
  • 英国首相斯塔默住所起火,警方紧急调查情况
  • 世界期待中美对话合作带来更多确定性和稳定性
  • 最美西游、三星堆遗址等入选“2025十大年度IP”
  • 长沙查处疑似非法代孕:有人企图跳窗,有女子被麻醉躺手术台
  • A股三大股指集体高开