【数据结构】用栈实现队列

前言:本节博客分享了用栈实现队列效果的思路以及代码,有需要借鉴即可。

1.题目及链接

LINK在这里插入图片描述

2.思路分析

如果要用栈实现队列,我们直到栈是先入后出的一个效果,所以我们可以用两个栈,这样逆转两次数不就是入栈之前数组的顺序嘛。下面是一些图辅助理解:

在这里插入图片描述

3.代码示例


#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//用数组的方式实现栈结构
typedef int STDateType;
typedef struct Stack
{STDateType* arr;int top;int capacity;
}ST;//初始化与销毁
void StackInit(ST* ps);
void StackDestroy(ST* ps);//入栈出栈
void StackPush(ST* ps,STDateType x);
STDateType StackTop(ST* ps);
void StackPop(ST* ps);//统计与判断
bool StackEmpty(ST* ps);
int StackSize(ST* ps);void StackInit(ST* ps)
{assert(ps);ps->arr = NULL;ps->capacity = ps->top = 0;
}void StackDestroy(ST* ps)
{assert(ps);free(ps->arr);ps->arr = NULL;ps->capacity = ps->top = 0;ps = NULL;
}void StackPush(ST* ps, STDateType x)
{assert(ps);if (ps->capacity == ps->top){//初始值的情况int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;STDateType* temp = (STDateType*)realloc(ps->arr, newcapacity * sizeof(STDateType));if (temp == NULL){perror("malloc fail!");exit(-1);}ps->arr = temp;ps->capacity = newcapacity;}ps->arr[ps->top++] = x;
}void StackPop(ST* ps)
{assert(ps);assert(ps->top > 0);ps->top--;
}STDateType StackTop(ST* ps)
{assert(ps);return ps->arr[ps->top - 1];
}bool StackEmpty(ST* ps)
{assert(ps);return ps->top == 0;
}int StackSize(ST* ps)
{assert(ps);return ps->top;
}typedef struct {ST pushtack;ST poptack;
} MyQueue;MyQueue* myQueueCreate() {//首先要创建一个队列结构体MyQueue* obj = (MyQueue*)malloc(sizeof(MyQueue));//对队列结构体中的栈做初始化调整StackInit(&obj->pushtack);StackInit(&obj->poptack);//返回return obj;
}//将元素 x 推到队列的末尾
void myQueuePush(MyQueue* obj, int x) {//插入数据StackPush(&obj->pushtack,x);
}//返回队列开头的元素
int myQueuePeek(MyQueue* obj) {//分两种情况:1.poptack为空2.poptack不为空if(StackEmpty(&obj->poptack))//为空需要导数据{while(!StackEmpty(&obj->pushtack)){int top = StackTop(&obj->pushtack);//取出push数据StackPop(&obj->pushtack);//删除pop数据StackPush(&obj->poptack,top);//放入push}}//poptack不为空return StackTop(&obj->poptack);
}//从队列的开头移除并返回元素
int myQueuePop(MyQueue* obj) {int front = myQueuePeek(obj);//取出StackPop(&obj->poptack);//删除return front;//返回
}//如果队列为空,返回 true ;否则,返回 false
bool myQueueEmpty(MyQueue* obj) {//两个都为空return StackEmpty(&obj->pushtack)&&StackEmpty(&obj->poptack);
}//释放
void myQueueFree(MyQueue* obj) {StackDestroy(&obj->pushtack);StackDestroy(&obj->poptack);free(obj);
}/*** Your MyQueue struct will be instantiated and called as such:* MyQueue* obj = myQueueCreate();* myQueuePush(obj, x);* int param_2 = myQueuePop(obj);* int param_3 = myQueuePeek(obj);* bool param_4 = myQueueEmpty(obj);* myQueueFree(obj);
*/

完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/525147.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入理解神经网络

图片怎么被识别的过程 (每层神经网络是数组,会对进来的数据进行加权求和[(weight*数据 然后累加) bias])(激活函数是为了训练weight和bias偏移值,在每个神经网络)(分类器会统计概率分类) 2. 引用链接 https://mp.weixin.qq.com/s?__bizMzIyNjMxOTY0NA&mid2247500124&…

FFmpeg--AAC音频解码流程

文章目录 AAC 组成函数分析读aac帧写aac帧aac的head参数设置 运行结果 AAC 组成 AAC音频格式&#xff1a;是⼀种由MPEG-4标准定义的有损⾳频压缩格式 ADTS:是AAC音频的传输流格式 AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成 每⼀帧的ADTS的头⽂件都包含了⾳频的采…

STL容器之哈希的补充——其他哈希问题

1.其他哈希问题 ​ 减少了空间的消耗&#xff1b; 1.1位图 ​ 位图判断在不在的时间复杂度是O(1)&#xff0c;速度特别快; ​ 使用哈希函数直接定址法&#xff0c;1对1映射&#xff1b; ​ 对于海量的数据判断在不在的问题&#xff0c;使用之前的一些结构已经无法满足&…

13. 用户注册功能实现

文章目录 一 、增加路由二、书写流程控制&#xff08;controller&#xff09;逻辑三、书写业务逻辑四、与DB交互五、测试 代码地址&#xff1a;https://gitee.com/lymgoforIT/bluebell 一 、增加路由 添加路由&#xff0c;使用分组管理 v1 : r.Group("/api/v1")//…

代码随想录训练营第41天 | 动态规划:01背包理论基础、动态规划:01背包理论基础(滚动数组)、LeetCode 416.分割等和子集

动态规划&#xff1a;01背包理论基础 文章讲解&#xff1a;代码随想录(programmercarl.com) 视频讲解&#xff1a;带你学透0-1背包问题&#xff01;_哔哩哔哩_bilibili 动态规划&#xff1a;01背包理论基础&#xff08;滚动数组&#xff09; 文章讲解&#xff1a;代码随想录(…

OpenStack之keystone(用户认证)

Keystone&#xff08;认证&#xff09; Keystone 概述 1)管理用户及其权限 2)维护OpenStack Services 的 Endpoint 3)Authentication&#xff08;认证&#xff09;和 Authorization&#xff08;授权&#xff09; keystone的名词概念 1.User&#xff08;用户或服务&#xf…

L-2:插松枝(Python)

作者 陈越 单位 浙江大学 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始状态为空。每人面前有用不完的松枝干和一个推送…

人工智能|机器学习——DBSCAN聚类算法(密度聚类)

1.算法简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法&#xff0c;簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点&#xff0c;因此DBSCAN聚类的方式也可以用于异常点的检测。 2.算法原…

ROS2动作通信的实现

文章目录 1.动作通信的概念及应用场景1.1 概念1.2 应用场景 2.准备工作3.动作通信的实现3.1 动作通信接口消息3.2 服务端实现3.3 客户端实现3.4 编译及运行 1.动作通信的概念及应用场景 1.1 概念 动作通信适用于长时间运行的任务。就结构而言动作通信由目标、反馈和结果三部分…

基于springboot+vue实现高校学生党员发展管理系统项目【项目源码+论文说明】

基于springboot实现高校学生党员发展管理系统演示 摘要 随着高校学生规模的不断扩大&#xff0c;高校内的党员统计及发展管理工作面临较大的压力&#xff0c;高校信息化建设的不断优化发展也进一步促进了系统平台的应用&#xff0c;借助系统平台可以实现更加高效便捷的党员信息…

给定时间求这是本年的第几天

之前我在编写个代码的时候是把它用大量的if逻辑判断语句&#xff0c;我并没有把是闰年这个条件选择出来&#xff0c;只是依据一般的想法—— #include <stdio.h> #define M 13 int main() {/********** Begin **********/int days[M] {0,31,28,31,30,31,30,31,31,30,3…

transformer--使用transformer构建语言模型

什么是语言模型? 以一个符合语言规律的序列为输入&#xff0c;模型将利用序列间关系等特征&#xff0c;输出一个在所有词汇上的概率分布.这样的模型称为语言模型. # 语言模型的训练语料一般来自于文章&#xff0c;对应的源文本和目标文本形如: src1"Ican do",tgt1…