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

下面是一些思路分析和代码分享,有需要借鉴即可。

1.问题描述

我想用队列来实现栈的功能,具体而言是用两个队列做底层做出栈的功能来。
有人可能会疑问会不会多次一举,这里仅作练习,为了更加进一步了解栈/队列的性质

2.思路分析

一个栈模拟入队列,一个栈模拟出队列,出队列时直接弹出模拟出队列栈的栈顶元素,当该栈为空时,将模拟入队列栈中所有元素导入即可,不是每次都需要导入元素
在这里插入图片描述

3.下面是代码示例

#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
#include<assert.h>//队列结构-底层:单链表实现
typedef int QDataType;
typedef struct QueueNode
{QDataType val;struct QueueNode* next;
}QNode;//两个指针的结构体
typedef struct Queue
{QNode* phead;QNode* ptail;int size;
}Queue;//实现的各种接口:
//初始化与销毁
void QueueInit(Queue* pq);
void QueueDestroy(Queue* pq);
int QueueSize(Queue* pq);
//插入与删除
void QueuePush(Queue* pq, QDataType x);
void QueuePop(Queue* pq);
//取头结点与取尾结点
QDataType QueueFront(Queue* pq);
QDataType QueueBack(Queue* pq);
bool QueueEmpty(Queue* pq);void QueueInit(Queue* pq)
{assert(pq);pq->phead = NULL;pq->ptail = NULL;pq->size = 0;
}void QueueDestroy(Queue* pq)
{assert(pq);QNode* pcur = pq->phead;while (pcur){QNode* next = pcur->next;//记录free(pcur);//销毁pcur = next;//更新}pq->phead = pq->ptail = NULL;pq->size = 0;
}int QueueSize(Queue* pq)
{assert(pq);return pq->size;
}void QueuePush(Queue* pq, QDataType x)//=尾插
{assert(pq);//申请一块堆空间QNode* newnode = (QNode*)malloc(sizeof(QNode));if (newnode == NULL){perror("malloc fail");exit(1);}//新节点的初始化newnode->val = x;newnode->next = NULL;//如果是没有结点时候需要插入if (pq->phead == NULL){pq->phead = pq->ptail = newnode;}//至少有一个节点时需要插入(尾插)else{pq->ptail->next = newnode;pq->ptail = newnode;}pq->size++;
}void QueuePop(Queue* pq)
{assert(pq);//这里其实有三种不同的情况://1.没有结点,这种是不可以删除的//2.一个结点,那么就需要phead与ptail都需要调整(容易被坑)//3.多个结点,只需要调整phead即可assert(pq->phead != NULL);if (pq->phead == pq->ptail){free(pq->phead);pq->phead = pq->ptail = NULL;}else{QNode* next = pq->phead->next;free(pq->phead);pq->phead = next;}pq->size--;
}QDataType QueueFront(Queue* pq)
{assert(pq);//没有数据,不能取出assert(pq->phead != NULL);//有数据return pq->phead->val;
}QDataType QueueBack(Queue* pq)
{assert(pq);//没有数据,不能取出assert(pq->phead != NULL);//有数据return pq->ptail->val;
}bool QueueEmpty(Queue* pq)
{assert(pq);return pq->phead == NULL;
}//两个队列
typedef struct {Queue q1;Queue q2;
} MyStack;MyStack* myStackCreate() {//申请空间MyStack* pst = (MyStack*)malloc(sizeof(MyStack));//初始化QueueInit(&pst->q1);QueueInit(&pst->q2);//返回return pst;
}void myStackPush(MyStack* obj, int x) {//把数据放入非空队列//q1非空,放入q1中if (!QueueEmpty(&obj->q1)){QueuePush(&obj->q1, x);}else//q2非空,放入q2中{QueuePush(&obj->q2, x);}
}int myStackPop(MyStack* obj) {//这个函数是一个重点,是删除函数,那么需要做的事情有把非空队列的前n-1项放到空队列中,删除非空队列的最后一个数字//找出非空队列与空队列的地址Queue* pEmptyQ = &obj->q1;Queue* pNoEmptyQ = &obj->q2;//如果q1为非空,则假设错误,所以交换一下if (!QueueEmpty(&obj->q1)){pEmptyQ = &obj->q2;pNoEmptyQ = &obj->q1;}//将非空队列中的前n-1个数据放入另一个空队列中while (QueueSize(pNoEmptyQ) > 1)//只要非空队列中剩余数据>=1,那么循环就一直进行{int front = QueueFront(pNoEmptyQ);//从非空队列中拿到第一个数字QueuePush(pEmptyQ, front);//把非空队列中的第一个数字交给空队列QueuePop(pNoEmptyQ);//删除非空队列中的第一个数字}int front = QueueFront(pNoEmptyQ);//从非空队列中拿出最后一个数字QueuePop(pNoEmptyQ);//删除非空队列中最后一个数字//返回return front;
}//这个函数只需要找出非空队列中最后一个数字就好
int myStackTop(MyStack* obj) {if (QueueEmpty(&obj->q1))//q1为空,拿出q2中的最后一个数字{return QueueBack(&obj->q2);}else//反之,如果q2为空,那么返回q1中最后一个数字{return QueueBack(&obj->q1);}
}bool myStackEmpty(MyStack* obj) {return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}void myStackFree(MyStack* obj) {QueueDestroy(&obj->q1);QueueDestroy(&obj->q2);free(obj);
}/*** Your MyStack struct will be instantiated and called as such:* MyStack* obj = myStackCreate();* myStackPush(obj, x);* int param_2 = myStackPop(obj);* int param_3 = myStackTop(obj);* bool param_4 = myStackEmpty(obj);* myStackFree(obj);
*/

5.练习

在这里插入图片描述

力扣题目练习请点击:LINK


完。

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

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

相关文章

UE4 Niagara 关卡3.4官方案例解析

Texture sampling is only supported on the GPU at the moment.(纹理采样目前仅在GPU上受支持) 效果&#xff1a;textures can be referenced within GPU particle systems。this demo maps a texture to a grid of particles&#xff08;纹理可以在GPU粒子系统中被引用这个演…

【书生·浦语大模型实战营】第5节 课后作业

LMDeploy 的量化和部署 0. 课程链接1. 课后作业1.1 基础作业1.2 进阶作业&#xff08;可选做&#xff09; 0. 课程链接 链接&#xff1a;https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 1. 课后作业 1.1 基础作业 使用 LMDeploy 以本地对话、网页Gra…

开展庆2024年“三八”国际妇女节系列纪念活动怎样向媒体投稿?

为了向媒体投稿,庆祝2024年“三八”国际妇女节系列纪念活动,你可以遵循以下步骤: 策划与准备: 确定纪念活动的主题和目标,例如提升女性权益、表彰女性成就、促进性别平等。 策划一系列活动,如研讨会、表彰仪式、展览、讲座等,确保内容丰富多样。 准备相关的背景资料、活动介…

解决物理机装不上VMnet1和VMnet8的虚拟网卡问题

问题描述&#xff1a; 博主在使用虚拟机时&#xff0c;发现物理机的ping命令连接不上虚拟机&#xff0c;导致xshell软件也连接不上&#xff0c;最后发现问题是更改适配器设置中没有虚拟机的网卡&#xff08;VMnet1和VMnet8&#xff09;&#xff1a; 方法一&#xff1a; 博主搜…

通过Apple Configurator 2导出iOS ipa包

通过Apple Configurator 2导出iOS ipa包 安装Apple Configurator 2 从Mac AppStore安装Apple Configurator 2 下载ipa 准备工作&#xff1a; 1、 电脑已经安装了Apple Configurator 2 2、 手机已经安装了目标软件 3、 Apple 账号已经下载过目标软件 打开后连接设备&#xf…

幻兽帕鲁(1.5.0)可视化管理工具(0.5.7 docker版)安装教程

文章目录 局域网帕鲁服务器部署教程帕鲁服务可视化工具安装配置服务器地址&#xff08;可跳过&#xff09;使用工具管理面板 1.5.0服务端RCON错误1.5.0服务端无法启动RCON端口 解决方法第一步&#xff1a;PalWorldSettings.ini配置第二步&#xff1a;修改PalServer.sh配置 局域…

深入理解现代JavaScript:从语言特性到应用实践

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 JavaScript作为一门动态、解释性脚本语言&…

安泰ATA-4051高压功率放大器在仿生水下声接收器设计中的应用

实验名称&#xff1a;ATA-4051功率放大器在仿生水下声接收器设计中的应用 实验目的&#xff1a;通过实验验证仿生水下声接收器的接收灵敏度与接收指向性 实验内容&#xff1a;搭建了水下声学测量系统进行实验&#xff0c;探究仿生水下声接收器的接收增益与接收指向性。 实验设备…

Tonka Finance,BTCFi 浪潮的发动机

在 2023 年年初&#xff0c;Ordinals 技术方案为比特币 Layer1 带来了一种全新的资产发行方式&#xff0c;此后一场以比特币生态为主战场的新一轮资金、注意力价值争夺战打响&#xff0c;并且越来越多的加密原教旨主义者、密码极客们加入这场战争中。我们看到&#xff0c;铭文市…

YOLOv8从入门到入土使用教程!(三)验证模型

⭐⭐⭐瞧一瞧看一看&#xff0c;新鲜的YOLOv9魔改专栏来啦&#xff01;⭐⭐⭐ YOLOv9有效改进专栏汇总|未来更新卷积、主干、检测头注意力机制、特征融合方式等创新 一、本文介绍 本文将演示如何使用YOLOv8进行训练、预测及验证&#xff01;模型训练、预测教程参考下文&#xf…

FreeRTOS操作系统学习——FreeRTOS工程创建

FreeROTS工程创建 详细步骤 如无特殊情况&#xff0c;大部人都要配置为外部高速时钟 另外&#xff0c;本实验使用了FreeRTOS&#xff0c;FreeRTOS的时基使用的是Systick&#xff0c;而 STM32CubeMX中默认的HAL库时基也是Systick&#xff0c;为了避免可能的冲突&#xff0c;最…

【Algorithms 4】算法(第4版)学习笔记 15 - 4.1 无向图

文章目录 前言参考目录学习笔记1&#xff1a;图表介绍1.1&#xff1a;定义1.2&#xff1a;常见应用1.3&#xff1a;术语1.4&#xff1a;一些图表处理问题2&#xff1a;图表 API2.1&#xff1a;图的表示2.2&#xff1a;无向图 API2.3&#xff1a;典型图处理代码2.4&#xff1a;图…