栈与队列小总结

2023-10-27

思维导图:

 

一 ,栈

栈,一种数据结构。具有后进先出的特点。有两种实现方式,第一种实现方式就是用数组结构来实现,第二种方式就是用链表的方式来实现。但是由于使用数组的方式来实现栈会更加的好,所以在这里我们用数组的方式来实现栈。

栈的实现:

 1.栈的结构定义

栈的结构中有三个元素,一个是数组指针,一个是整型的Top(来指向栈顶元素),一个是整型的Capacity(来显示栈的容量情况)。代码如下:

typedef int DataType;
typedef struct ST
{
	DataType* a;//数组指针
	int Top;//栈顶指针
	int capaCity;//容量
}ST;
2.栈的初始化

栈的初始化的作用就是让栈里的元素有一个初始值,要不然会报错。在这里我将指针的初始值设为NULL,容量设为0。在这里我还把Top值设为0,设为0以后Top指向的就相当于栈顶元素的下一位。代码如下:

 代码:

void STinit(ST* stack)
{
	assert(stack);
	assert(stack->a);
	stack->a = NULL;
	stack->Top = 0;
	stack->capaCity = 0;
}
 3.栈的插入

栈的插入只能插入一个位置,这个位置就是栈顶。栈只能从栈顶插入。代码如下:

 代码:

void STpush(ST* stack,int x)
{
	assert(stack);
	if (stack->capaCity == stack->Top)//扩容操作
	{
		int newCapacity = stack->capaCity == 0 ? 4 : 2 * stack->capaCity;
		stack->a = (DataType*)realloc(stack->a, newCapacity * sizeof(DataType));
		if (stack->a == NULL)
		{
			perror("realloc fail");
			return ;
		}
		stack->capaCity = newCapacity;
	}
		stack->a[stack->Top] = x;
		stack->Top++;
}

当a为NULL时,realloc的作用相当于malloc。

4.栈的删除

栈的删除操作也是一个较为简单的操作。不过要对栈是否为NULL进行判断,因为空栈不能删除。栈的删除操作代码如下:

bool STEmpty(ST* stack)//判断栈是否为NULL
{
	assert(stack);
	return stack->Top == 0;
}
void STPop(ST* stack)
{
	assert(stack);
	assert(!STEmpty(stack));
	stack->Top--;//栈的删除操作就是将下标--
}
5.获取栈顶元素

栈是一个数组,它的顶是在数组的最后面。获取一个数组的最后面的代码便是将下标为Top-1位置上的数组元素返回。代码如下:

DataType* STFront(ST* stack)
{
	assert(stack);
	assert(stack->a);
	DataType* front = stack->a[stack->Top - 1];
	return front;
}
 6.销毁栈

栈使用完了便要销毁栈,注意栈内有一个malloc出来的数组,所以就要free掉。

二,队列

队列,也是一种数据结构。队列的特点就是先进先出。队列的实现方式也有两种,那就是数组实现与单链表的方式实现。那种方式更好呢?答案是单链表的方式实现会更好。所以在此我会写一个以单链表的方式实现的队列。

队列的实现

1.队列的结构

队列的结构相比于栈会复杂一些,原因是因为队列的结构会有两层嵌套。定义队列结构的代码如下:

代码:

typedef int DataType;
typedef struct Qnode//队列中的一个节点
{
	DataType val;
	struct Qnode* next;
}Qnode;

typedef struct Queue//一整个队列
{
	Qnode* phead;
	Qnode* ptail;
	int size;
}Queue;
2.初始化 

 初始化就是一个老套路了,基本上每次写这些结构都要初始化。指针型的初始化为NULL,整型的初始化为0。代码如下:

 代码:

void QInit(Queue* pq)
{
	assert(pq);
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}
3.队列中数据的插入

队列的插入不需要检查容量,但是需要生成新的队列节点。并且队列的插入是尾插。队列的插入还需要分两种情况——1.队列为空时,2.队列不为空时。所以队列的插入代码如下:

 代码:

void QPush(Queue* pq,DataType x)
{
	assert(pq);
	Qnode* newnode = (Qnode*)malloc(sizeof(Qnode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}
	if (pq->ptail == NULL)//分两种情况
	{
		assert(!pq->phead);
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}
	pq->ptail->val = x;
	pq->size++;
}
4.从队列中删除数据

队列中的删除操作也是头删的操作,所以根据链表的头删操作,队列的删除操作代码如下:

代码:

void QPop(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));//判断pq是否为空,空队列不能删
	Qnode* cur = pq->phead;
	Qnode* next = cur->next;//记录下一个节点
	free(cur);//释放掉cur
	pq->phead = next;
	pq->size--;
}
 5.获取头,尾节点的值

这个操作是十分简单的,不过就是将phead,ptail指向的节点的值返回。代码如下:

代码:

DataType QFront(Queue* pq)
{
	assert(pq);
	assert(pq->phead);//pq->phead不能为NULL
	return pq->phead->val;
}
DataType QBack(Queue* pq)
{
	assert(pq);
	assert(pq->ptail);//pq->ptail不能为NULL
	return pq->ptail->val;
}
 4.队列的销毁

因为这篇博客里写的队列是按照链表的形式来写的,所以队列的销毁操作也就可以参照链表的销毁形式来写。代码如下:

void QDestory(Queue* pq)
{
	assert(pq);
	while (!QueueEmpty(pq))
	{
		Qnode* cur = pq->phead;
		Qnode* next = cur->next;
		free(cur);
		pq->phead = next;
	}
	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈与队列小总结 的相关文章

随机推荐

  • ERP经典范式知多少—重温Go/Nogo范式的经典实验

    本文同步发布于 脑之说 微信公众号 欢迎搜索关注 ERP Event related Potentials 作为神经电生理研究中的重要方法已经被广泛的应用在脑科学研究中 在ERP研究中 实验范式是重中之重 可靠的实验范式能够帮助研究者更好的
  • db2按时间戳或日期条件查询

    我一同事写的 记录一下 substr char timestamp 1 10 date timestamp是表中timestamp字段 date 是条件值 select from table where substr char timest
  • stm32笔记:GPIO的的配置和操作(1)推挽输出方式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 封装端口输出高低电平控制LED显示 以下方式便于修改 LED h ifndef LED H define LED H include stm32f10x h define
  • Python二级必考函数.format()函数

    目录 一 format 函数介绍 二 函数运用 位置填充 填充物 fill 对齐 align 宽度 width sign参数保留正负号 指定精度 nf 分隔符 进制 o b d x 一 format 函数介绍 format 函数用来收集其后
  • Python 第三方模块 统计2 patsy,chowtest

    一 patsy 官方文档 https pypi org project patsy 1 概述 1 简介 patsy是1个用于描述统计模型 尤其是线性模型或具有线性组件的模型 和构建设计矩阵的Python库 其受R S语言中的公式迷你语言启发
  • 数据库索引原理及优化

    转发内容 一 摘要 本文以MySQL数据库为研究对象 讨论与数据库索引相关的一些话题 特别需要说明的是 MySQL支持诸多存储引擎 而各种存储引擎对索引的支持也各不相同 因此MySQL数据库支持多种索引类型 如BTree索引 哈希索引 全文
  • Python实现红黑树的删除操作

    Python实现红黑树的删除操作 本专栏的上一篇文章使用Python实现了红黑树的插入操作 参考 https blog csdn net weixin 43790276 article details 106456969 本篇文章使用Pyt
  • STL模板简介

    STL是C 中的优秀作品 有了它的陪伴 许多底层的数据机构以及算法我们不需要自己写 可以直接用STL里面的 就相当于我们站在巨人的肩膀上 飞一般地向前进 一 什么是STL STL standard template library 标准模板
  • H5跳转微信小程序-成功案例(VUE)(踩坑无数)

    这里写自定义目录标题 准备工作 根据官方提供的资料需准备以下几点 1 已认证的服务号 2 绑定JS接口安全域名 在微信公众平台设置 3 IP白名单 在微信公众平台设置 4 将小程序和H5公众号进行关联 在微信公众平台设置 5 页面path和
  • paramiko 无法实例化 transport

    背景 Paramiko is a pure Python 1 2 7 3 4 implementation of the SSHv2 protocol 2 providing both client and server functiona
  • python信号处理算法库_语音信号处理之时域分析-音高追踪及其Python实现

    1 概述 在音高及其Python实现一文 中 我们使用了简单的 观察法 来计算音高 这并不太难 但这并不有好而且费时费力 那么我们就想 如何通过分析和计算 使用算法来自动计算音高呢 用算法让计算机自动抓取音高的过程 称为音高追踪 Pitch
  • Flex 布局教程:语法篇

    网页布局 layout 是 CSS 的一个重点应用 布局的传统解决方案 基于盒状模型 依赖 display 属性 position属性 float属性 它对于那些特殊布局非常不方便 比如 垂直居中就不容易实现 2009年 W3C 提出了一种
  • Glog 使用

    原文链接 glog使用
  • Java复习-26-枚举

    枚举 替换多例设计 目的 使用场景 不用也没啥 定义一个描述性别的类 那么该对象只有两个 男 女 或者描述颜色基色的类 可以使用 红色 绿色 蓝色 功能 用于定义有限个数对象的一种结构 多例设计进化版 方法 enum 关键字 提供有enum
  • 从码云上克隆代码到IDEA及项目启动

    码云版本库地址复制 输登录代码库系统 找到 版本库 点击 版本库地址 下拉列表 选中 http zjs 190 100 21 10 1001 r aqjg extern project git 版本库地址复制 如果不是首次clone项目可直
  • 头歌答案Python,001

    金宝 答案在这里 自己抄 1 第一关 计算机 num 1 int input 请输入第一个数 print num 1 num 2 int input 请输入第二个数 print num 2 alg input 请选择要执行的运算符 prin
  • 单测mock和stub

    A variety of different terms are used to refer to these custom objects In an effort to clarify the vocabulary Gerard Mes
  • Design1.CMOS工艺OD门,传输门,三态门原理应用浅析

    纲要 OD门 传输门 三态门 1 OD门 i 概念 在CMOS电路中为了满足输出电平变换 吸收大负载电流以及实现线与连接等需要 需要将输出级电路结构改为漏极开路输出的MOS管 构成漏极开路输出 Open Drain Output 门电路 简
  • Android中的Selector的用法

    Android中的Selector主要是用来改变ListView和Button控件的默认背景 其使用方法可以按一下步骤来设计 以在mylist view xml为例 1 创建mylist view xml文件 首先在res目录下新建draw
  • 栈与队列小总结

    思维导图 一 栈 栈 一种数据结构 具有后进先出的特点 有两种实现方式 第一种实现方式就是用数组结构来实现 第二种方式就是用链表的方式来实现 但是由于使用数组的方式来实现栈会更加的好 所以在这里我们用数组的方式来实现栈 栈的实现 1 栈的结