用队列实现栈

 

1 .思路及目的

 用两个标准的队列(先进先出)实现栈(后进先出)

始终保持一个队列为空,往非空的栈插入数据

删除数据时,将数据导入另一个队列,留下最后一个数据(这个数据就是要删除的数据)

并实现多个接口:

push(插入数据)

top(返回栈顶元素)

pop(删除数据)

empty(判空)

栈结构图示 :q1和q2为队列,obj是构成的栈

 

栈基本接口: 

typedef int QDataType;

// 链式结构:表示队列

typedef struct QListNode

{

    struct QListNode* _next;

    QDataType _data;

}QNode;

// 队列的结构

typedef struct Queue

{

    QNode* _front;

    QNode* _rear;

    int size;

}Queue;

// 初始化队列

void QueueInit(Queue* q);

// 队尾入队列

void QueuePush(Queue* q, QDataType data);

// 队头出队列

void QueuePop(Queue* q);

// 获取队列头部元素

QDataType QueueFront(Queue* q);

// 获取队列队尾元素

QDataType QueueBack(Queue* q);

// 获取队列中有效元素个数

int QueueSize(Queue* q);

// 检测队列是否为空,如果为空返回非零结果,如果非空返回0

int QueueEmpty(Queue* q);

// 销毁队列

void QueueDestroy(Queue* q);

1.1 栈初始化

MyStack* myStackCreate() {

    MyStack* pst = (MyStack*)malloc(sizeof(MyStack));

    QueueInit(&(pst->q1));

    QueueInit(&(pst->q2));

    return pst;

}

 1.2 插入数据

使用两个栈实现队列,往非空的栈插入数据,若两个栈都为空,往任意一个栈插入数据即可

void myStackPush(MyStack* obj, int x) {

    if(!QueueEmpty(&(obj->q1)))

    {

        QueuePush(&(obj->q1), x);

    }

    else

    {

        QueuePush(&(obj->q2), x);

    }

}

1.3 删除数据 

删除数据时,需要将队列内的数据导入另一个队列,留下最后一个数据,这个数据就是要删除的数据

图解: 

 

int myStackPop(MyStack* obj) {

    Queue* empty = &(obj->q1);

    Queue* nonEmpty = &(obj->q2);

    if(!QueueEmpty(&(obj->q1)))

    {

        nonEmpty = &(obj->q1);

        empty = &(obj->q2);

    }

    while(QueueSize(nonEmpty) > 1)

    {

        QueuePush(empty, QueueFront(nonEmpty));

        QueuePop(nonEmpty);

    }

    int top = QueueFront(nonEmpty);

    QueuePop(nonEmpty);

    return top;

}

1.4  获取栈顶元素

即获取非空队列的尾部元素

int myStackTop(MyStack* obj) {

    if(!QueueEmpty(&(obj->q1)))

    {

        return QueueBack(&(obj->q1));

    }

    else{

        return QueueBack(&(obj->q2));

    }

}

1.5 栈的判空 

两个队列都为空,栈才为空

bool myStackEmpty(MyStack* obj) {

    return QueueEmpty(&(obj->q1)) && QueueEmpty(&(obj->q2));

1.6 栈的销毁 

分别销毁两个队列,最后再销毁栈

void myStackFree(MyStack* obj) {

    QueueDestroy(&(obj->q1));

    QueueDestroy(&(obj->q2));

    free(obj);

}

2 . 总结 

利用两个队列实现栈的关键,在于数据的删除、插入时如何处理 

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

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

相关文章

各种排序算法【持续更新中.....】

1.归并排序 归并排序 ,归并排序是采用分治法(Divide and Conquer)的一个非常典型的应用,所以我们先来说一下什么是分治法。 分治法 定义 分治(英语:Divide and Conquer),字面上的解释是「分…

什么情况?我代码没了

前两天检视代码时,发现PR里面有两个提交的描述信息一模一样,于是我提出应该将这两个提交合并成一个,保持提交树的清晰。 1 先储存起来! 而同事这时正在开发别的特性,工作区不是干净的,没法直接执行 git r…

xss漏洞(二,xss靶场搭建以及简单利用)

本文仅作为学习参考使用,本文作者对任何使用本文进行渗透攻击破坏不负任何责任。 一,环境搭建。 使用工具:PHP study,dvwa靶场。 1,GitHub上下载dvwa到PHP study的WWW文件夹内,并解压。 dvwa下载地址 …

动态规划之——背包DP(进阶篇)

文章目录 概要说明多重背包(朴素算法)模板例题思路code 多重背包(二进制优化)模板例题思路code 多重背包(队列优化)模板例题思路 混合背包模板例题思路code1code2 二维费用背包模板例题思路code 概要说明 本文讲多重背包、混合背包以及二维费用背包&…

企业社会责任(CSR)国际标准有哪些?

以下是一些常见的企业社会责任(CSR)国际标准和相关体系等: 原则性、指南性标准 ISO 26000《社会责任指南》 :将社会责任归纳为7个核心方面,即公司治理、人权、劳工、环境、公平运营实践、消费者问题以及对社会发展作贡…

codetop标签双指针题目大全解析(C++解法),双指针刷穿地心!!!!!

写在前面:此篇博客是以[双指针总结]博客为基础的针对性训练,题源是codetop标签双指针近一年,频率由高到低 1.无重复字符的最长子串2.三数之和3.环形链表4.合并两个有序数组5.接雨水6.环形链表II7.删除链表的倒数第N个节点8.训练计划II9.最小覆…

餐饮业的数字化突围:价格战下的转型与新生

原文链接:https://tecdat.cn/?p37241 餐饮业价格战升级了,越打越激烈。近日,各餐饮巨头也被迫纷纷下场。 “太二酸菜鱼客单价跌至七年前” “9.9元就可以点上海底捞的一份锅底” “必胜客推出人均20元的乐享店”…… 消费降级的时代潮水&am…

dockerfile定制镜像 docker-compose编排容器

1 dockerfile dockerfile本质上是利用了Linux系统的挂载(UnionFS),将多个目录挂载到同一目录下,实现镜像的层叠式结构,从而实现功能聚合。 1.1 一个最简单的程序 package mainimport "fmt"func main() {f…

4.Redis数据结构通用命令

Redis数据结构 Redis是一个键值对的数据库。 key:大多都是String value: 类型多种多样 Redis通用命令 keys :查看所有的key 不建议在生产环境上使用keys命令,因为redis是单线程的,keys命令会搜索很长一段时间,搜索的期间redi…

Java I/O (Input/Output)——文件字节流

博客主页:誓则盟约系列专栏:Java SE 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Java I/O 简介 Java I/O(输入/输出)是 Java 程序中…

[C++] 模板进阶:特化与编译链接全解析

文章目录 非类型模板类型形参非类型模板参数代码示例 **模板的特化**为什么要有模板的特化函数模板特化使用场景与示例函数模板特化的实现细节 类模板特化全特化示例 偏特化部分优化通过进一步限制模板参数进行特化偏特化为指针类型示例:偏特化为引用类型示例&#…

menuconfig+Kconfig的简单配置

目录 1.背景 2.管理方案 2.1:.h中直接定义 2.2:.batCmake 2.3:Kconfig 2.3.1 环境安装 2.3.2 代码 2.3.2.1 目录结构 2.3.2.2 ble目录下的Kconfig 2.3.2.3 hardware目录下的Kconfig 2.3.2.4 rtos目录下的Kconfig 2.3.2.5 根目录 …

申请专利需要准备哪些材料?

申请专利需要准备哪些材料?

实践致知第17享:电脑忽然黑屏的常见原因及处理方法

一、背景需求 小姑电话说:最近,电脑忽然就黑屏了(如下图所示),但是等待几十秒甚至一分钟,电脑就能自然恢复了,这种状况一天能出现三四次,怎么办? 二、分析诊断 电脑黑屏…

keeplive配置详解与haproxy配置详解

一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构,只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 1、组播地址 224.0.0.18,根据组播地址进行通信,主备之间发…

Java多线程-----定时器(Timer)及其实现

目录 一.定时器简介: 二.定时器的构造方法与常见方法: 三.定时器的模拟实现: 思路分析: 代码实现: 在开发中,我们经常需要一些周期性的操作,例如每隔几分钟就进行某一项操作,这…

标准IO——文件定位、文件IO

续:feof、ferror(检测一个流是否出错)、clearerr(清除一个流出错的标记)。 一、标准IO文件定位 1、fseek(定位) int fseek(FILE *stream , long offset(偏移长度) , int whence(偏移起始位置)) 其中when…

阿里云SMS服务C++ SDK编译及调试关键点记录

一. 阿里云SMS服务开通及准备工作 在阿里云官网上完成这部分的工作 1. 申请资质 个人or企业 我这里是用的企业资质 2. 申请签名 企业资质认证成功后,会自动赠送一个用于测试的短信签名 也可以自己再进行申请,需要等待审核。 3. 申请短信模板 企…

还没用过OBS Studio?快来提升你的技术分享效率!

前言 在浩瀚的数字海洋中,有这么一款神器,它低调却光芒四射,默默改变着无数内容创作者的命运;嘿,你猜怎么着?它既不是天价的专业设备,也不是遥不可及的神秘黑科技,而是开源世界的瑰宝…

本地Gitlab-runner自动编译BES项目

0 Preface/Foreword 1 Gitlab-runner配置情况 具体情况如下: Gitlab-ruuner运行在wsl 1中的Ubuntu 18.04 distro上专门为GitLab-runner分配了一个用户,名为gitlab-runner 2 自动编译 2.1 找不到编译工具链 根据错误提示,交叉编译工具链未找…