数据结构学习笔记(栈、队列)整理与总结

栈的概念:
栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
出栈:栈的删除操作叫做出栈。出数据也在栈顶。
结构
在这里插入图片描述

栈结构之顺序栈的基本介绍

概念: 栈是限定仅在表尾进行插人或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此栈又称为后进先出的线性表,简称LIFO结构。而顺序栈就是使用顺序结构来实现栈,顺序栈的空间是连续分配的。
结构图:
在这里插入图片描述
结构代码描述:

定义顺序栈结构体:
// An highlighted block
//顺序栈
typedef struct SeqStack
{
   
	ElemType *base; //栈空间
	size_t    capacity;
	size_t    top; //栈顶指针
}SeqStack;

顺序栈的常用操作

**初始化顺序栈**
// An highlighted block
void SeqStackInit(SeqStack *pst, int sz)
{
   
    //设置容量的初始化大小
	pst->capacity = sz > SEQ_STACK_DEFAULT_SIZE ? sz : SEQ_STACK_DEFAULT_SIZE;
    //申请空间
	pst->base = (ElemType *)malloc(sizeof(ElemType) * pst->capacity);
	assert(pst->base != NULL);
	pst->top = 0;//栈顶的初始化指向
}
**判断栈是否满或者空**
// An highlighted block
//判断栈是否满
bool IsFull(SeqStack *pst)
{
   
	return pst->top >= pst->capacity;
}
//判断栈是否空
bool IsEmpty(SeqStack *pst)
{
   
	return pst->top == 0;
}
**入栈**
// An highlighted block
void SeqStackPush(SeqStack *pst, ElemType v)
{
   
	if(IsFull(pst))
	{
   
		printf("栈已满,%d不能入栈.\n", v);
		return;
	}
	pst->base[pst->top++] = v;//放到top所指的下标的空间,然后top再++
}
**出栈**
// An highlighted block
void SeqStackPop(SeqStack *pst)
{
   
	if(IsEmpty(pst))
	{
   
		printf("栈已空,不能出栈.\n");
		return;
	}
	pst->top--;//出栈
}
**获取栈顶元素**
// An highlighted block
ElemType SeqStackTop(SeqStack *pst)
//void SeqStackTop(SeqStack *pst, ElemType *v) //出参
{
   
	if(IsEmpty(pst))
	{
   
		printf("栈已空,没有栈顶元素.\n");
		return;
	}
	return pst->base[pst->top-1];//top-1不会更改top指针的指向,这样就不会删除指向的元素
	//*v = pst->base[pst->top-1];
}
**打印栈内所有数据**
// An highlighted block
void SeqStackShow(SeqStack *pst)
{
   
	for(int i=pst->top-1; i>=0; --i)
		printf("%d\n", pst->base[i]);
}
**顺序栈的摧毁**
// An highlighted block
void SeqStackDestroy(SeqStack *pst)
{
   
	free(pst->base);
	pst->base = NULL;
	pst->capacity = pst->top = 0;
}

栈结构之链栈的基本介绍

概念: 栈是限定仅在表尾进行插人或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶,相应地,表头端称为栈底。不含元素的空表称为空栈。栈的修改是按后进先出的原则进行的,因此栈又称为后进先出的线性表,简称LIFO结构。而链栈就是使用链式结构来实现栈,链栈的空间可以是不连续分配。
结构:
在这里插入图片描述

**代码描述:**
// An highlighted block
typedef struct LinkStackNode
{
   
	ElemType data;
	struct LinkStackNode *next;
}LinkStackNode;
typedef struct LinkStack
{
   
	LinkStackNode *head;
}LinkStack;

链栈的常用操作

**初始化**
// An highlighted block
void LinkStackInit(LinkStack *pst)
{
   
	pst->head = NULL;
}
**入栈**
// An highlighted block
void LinkStackPush(LinkStack *pst, ElemType v)
{
   
	LinkStackNode *s = (LinkStackNode*)malloc(sizeof(LinkStackNode));
	assert(s != NULL);
	s->data = v;

	s->next = pst->head;
	pst->head = s;
}
**出栈**
// An highlighted block
void LinkStackPop(LinkStack *pst)
{
   
	LinkStackNode *p;
	if(pst->head == NULL)
		return;
	p  = pst->head;
	pst->head = p->next;
	free(p);//记得释放,都是malloc出来的
}
**栈顶元素**
// An highlighted block
ElemType LinkStackTop(LinkStack *pst)
{
   
	assert(pst->head != NULL);
	return pst->head->data;
}
**显示栈内数据**
// An highlighted block
void LinkStackShow(LinkStack *pst)
{
   
	LinkStackNode *p = pst->head;
	while(p != NULL)
	{
   
		printf("%d\n", p->data);
		p = p->next;
	}
}
**摧毁栈**
// An highlighted block
void LinkStackDestroy
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
你好!关于学习数据结构C语言笔记,我可以给你一些基本的指导和概念。数据结构是计算机科学中非常重要的一门课程,它涉及存储和组织数据的方法。C语言是一种常用的编程语言,很适合用于实现各种数据结构。 下面是一些数据结构的基本概念,你可以在学习笔记中包含它们: 1. 数组(Array):一种线性数据结构,可以存储相同类型的元素。在C语言中,数组是通过索引访问的。 2. 链表Linked List):也是一种线性数据结构,但不需要连续的内存空间。链表由节点组成,每个节点包含数据和指向下一个节点的指针。 3. Stack):一种后进先出(LIFO)的数据结构,类似于装满物品的箱子。在C语言中,可以使用数组或链表来实现。 4. 队列(Queue):一种先进先出(FIFO)的数据结构,类似于排队等候的队伍。同样可以使用数组或链表来实现队列。 5. 树(Tree):一种非线性数据结构,由节点和边组成。每个节点可以有多个子节点。二叉树是一种特殊的树结构,每个节点最多有两个子节点。 6. 图(Graph):另一种非线性数据结构,由节点和边组成。图可以用来表示各种实际问题,如社交网络和地图。 这只是数据结构中的一些基本概念,还有其他更高级的数据结构,如堆、哈希表和二叉搜索树等。在学习笔记中,你可以介绍每个数据结构的定义、操作以及适合使用它们的场景。 希望这些信息对你有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

康x呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值