用两个队列实现栈

如何用两个队列实现一个栈及其性能分析 在计算机科学中,栈(Stack)和队列(Queue)是两种常见的数据结构,它们各自有着独特的操作方式和应用场景。栈是一种后进先出(LIFO, Last In First Out)的数据结构,而队列则是一种先进先出(FIFO, First In First Out)的数据结构。在某些特定场景下,我们可能需要使用一种数据结构来实现另一种数据结构的功能。本文将详细探讨如何使用两个队列来实现一个栈,并分析相关栈操作的运行时间。 阅读详情

1.栈的基本实现代码

用队列实现栈首先要建立两个队列,通过这两个队列的出入数据实现栈的出入数据

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
#include<stdbool.h>
typedef int QDataType;
typedef struct QueueNode
{
	struct QueueNode* next;
	QDataType val;
}QNode;
typedef struct Queue
{
	QNode* phead;
	QNode* ptail;
	int size;
}Queue;
void QueueInit(Queue* pq)
{
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);

		cur = next;
	}

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}

	newnode->next = NULL;
	newnode->val = x;

	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}

	pq->size++;
}

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);
	if (pq->phead->next == NULL)
	{
		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);

	return pq->phead->val;
}

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	return pq->ptail->val;
}


int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}

以上就是队列的实现代码 放在上面供大家观看 这是我们用来实现栈的工具

2初始化栈 

先设立两个队列并且将他们初始化 初始化时要判断malloc是否成功

typedef struct MyStack { 
	Queue q1;
	Queue q2;
} MyStack;
MyStack* myStackCreate() {
	MyStack* stack = (MyStack*)malloc(sizeof(MyStack));
	QueueInit(&stack->q1);
	QueueInit(&stack->q2);

	return stack;
}

3.队列出入数据

哪个队列有数据我们就往那个队列进数据

当两个队列都没有数据时我们往q1进数据

void myStackPush(MyStack* obj, int x) {
	if (!QueueEmpty(&obj->q1))
	{
		QueuePush(&obj->q1, x);
	}
	else
	{
		QueuePush(&obj->q2, x);
	}
}

4.队列出数据

当q1有数据q2没有数据时将q1中的N-1个数据传到q2再将q1中剩余的一个数据删除

int myStackPop(MyStack* obj) {
	Queue* empty = &obj->q1;
	Queue* nonempty = &obj->q2;
	if (!QueueEmpty(empty))
	{
		empty = &obj->q2;
		nonempty = &obj->q1;
	}
	while (QueueSize(nonempty)-1>0)
	{
		QueuePush(empty, QueueFront(nonempty));
		QueuePop(nonempty);
	}
	int temp = QueueFront(nonempty);
	QueuePop(nonempty);
	return temp;
}

5.返回队列顶端的数据

int myStackTop(MyStack* obj) {
	//assert(QueueSize(&obj->q1) || QueueSize(&obj->q2));
	if (!QueueEmpty(&obj->q1))
	{
		return QueueBack(&obj->q1);
	}
	else
	{
		return QueueBack(&obj->q2);
	}
}

6.判断队列是否为空

bool myStackEmpty(MyStack* obj) {
	return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}

7.释放队列

void myStackFree(MyStack* obj) {
	QueueDestroy(&obj->q1);
	QueueDestroy(&obj->q2);
	free(obj);
}

 8.整体代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>
typedef int StDateType;
typedef struct Stack
{
	StDateType* a;
	int top;
	int capacity;
}stack;
typedef struct MyQueue
{
	stack* S1;
	stack* S2;
}MyQueue;
void QueueInit(Queue* pq)
{
	pq->phead = NULL;
	pq->ptail = NULL;
	pq->size = 0;
}

void QueueDestroy(Queue* pq)
{
	assert(pq);

	QNode* cur = pq->phead;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);

		cur = next;
	}

	pq->phead = pq->ptail = NULL;
	pq->size = 0;
}
void QueuePush(Queue* pq, QDataType x)
{
	assert(pq);

	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		return;
	}

	newnode->next = NULL;
	newnode->val = x;

	if (pq->ptail == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else
	{
		pq->ptail->next = newnode;
		pq->ptail = newnode;
	}

	pq->size++;
}

void QueuePop(Queue* pq)
{
	assert(pq);
	assert(pq->size != 0);
	if (pq->phead->next == NULL)
	{
		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);

	return pq->phead->val;
}

QDataType QueueBack(Queue* pq)
{
	assert(pq);
	return pq->ptail->val;
}


int QueueSize(Queue* pq)
{
	assert(pq);

	return pq->size;
}

bool QueueEmpty(Queue* pq)
{
	assert(pq);

	return pq->size == 0;
}
MyStack* myStackCreate() {
	MyStack* stack = (MyStack*)malloc(sizeof(MyStack));
	QueueInit(&stack->q1);
	QueueInit(&stack->q2);

	return stack;
}
void myStackPush(MyStack* obj, int x) {
	if (!QueueEmpty(&obj->q1))
	{
		QueuePush(&obj->q1, x);
	}
	else
	{
		QueuePush(&obj->q2, x);
	}
}
int myStackPop(MyStack* obj) {
	Queue* empty = &obj->q1;
	Queue* nonempty = &obj->q2;
	if (!QueueEmpty(empty))
	{
		empty = &obj->q2;
		nonempty = &obj->q1;
	}
	while (QueueSize(nonempty)-1>0)
	{
		QueuePush(empty, QueueFront(nonempty));
		QueuePop(nonempty);
	}
	int temp = QueueFront(nonempty);
	QueuePop(nonempty);
	return temp;
}
int myStackTop(MyStack* obj) {
	//assert(QueueSize(&obj->q1) || QueueSize(&obj->q2));
	if (!QueueEmpty(&obj->q1))
	{
		return QueueBack(&obj->q1);
	}
	else
	{
		return QueueBack(&obj->q2);
	}
}
bool myStackEmpty(MyStack* obj) {
	return QueueEmpty(&obj->q1) && QueueEmpty(&obj->q2);
}
void myStackFree(MyStack* obj) {
	QueueDestroy(&obj->q1);
	QueueDestroy(&obj->q2);
	free(obj);
}

广东省道路工程检测练习试题(单选题)真题 1.一般项目的合格点率应达到( ),且不合格点的最大偏差值不得大于规定允许偏差值的1.5倍。A.不低于75%B.不低于80%C.不低于85%D.不低于90%答案:B2.进行土路基平整度检测时,当路宽小于9m,检测点数应为( )A.1B.2C.3D.4答案:A3.根据《城镇道路工程施工与质量验收规范》,在分部工程中,根据工种、材料、施工工艺等划分的是( )A.单位工程B.分项工程C.分部工程D.工序工程答案:B4.根据《城镇道路工程施工与质量验收规范》,土方路基压实度的检测频率为每1000m每压实层抽检( ) 阅读详情

相关推荐

GPU计算板卡设计原理图:735-基于3U VPX的AGX Xavier GPU计算主板

基于3U VPX的 Jetson AGX Xavier GPU计算主板是LINUX环境下软件开发等理想工具。是用于视频处理,相机信号,支持PCIE、USB、RS422、RS232、网口、SPI、I2C等综合性的信号计算主板。3. 支持外接HDMI连接显示器,并支持键盘,鼠标等外接设备进行调试。8 核 ARM v8.2 64 位 CPU、8 MB L2 + 4 MB L3。4路Gigabit Ethernet (10/100/100)link。1路RS232,1路RS485。1路 NVMe PCIeX4。

981

两个队列模拟实现栈

用两个队列模拟实现栈

m0_63020222的博客 6915

飞牛NAS一键部署小雅Emby全家桶:解锁海量影音资源与智能刮削

本文详细介绍了如何在飞牛NAS上通过Docker一键部署小雅Emby全家桶,完美解决传统WebDAV挂载无法刮削元数据的问题。该方案整合了小雅Alist海量影音资源与Emby媒体服务器,通过预下载超百GB元数据包,自动实现海报、简介等信息的完美匹配,打造出精美的个人影音库。部署过程需准备阿里云盘令牌与充足存储空间,并详解了从环境配置、镜像拉取到最终验证的完整步骤及优化技巧。

weixin_28312391的博客 926

【使用两个队列实现栈】

使用两个队列实现栈的操作

如果需要沟通,可添加微信公众号找我免费答疑 3019

COMSOL仿真教程—激光烧蚀

本例使用二维模型,将来自激光的入射热通量模拟为金属表面上空间分布的热源,从而得到金属的烧蚀过程和瞬态温度分布。

qq_40977332的博客 2万+

激光雷达的64线,32线,16线,你弄懂了吗?

激光雷达的 64 线、32 线、16 线是指激光雷达系统中能够同时发射和接收激光脉冲的激光线的数量5。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 2640

[数据结构] 用两个队列实现栈详解

​我们上篇文章讲述了用两个栈实现队列,用过对上篇文章的学习后,我们再去学用两个队列实现栈就变得相对来说容易了很多。本篇文章会对用两个队列实现栈进行详解,希望会对你有所帮助。

weixin_67596609的博客 3342

GEE:变异系数法在遥感影像分析中的应用及权重计算

本文介绍了在Google Earth Engine(GEE)平台上基于变异系数法的多指标加权遥感影像分析方法。该方法通过计算每个指标的平均值和标准差,进而计算变异系数来评估指标的变化程度。利用变异系数,我们可以计算每个指标的权重,并将其应用于加权和指数的计算,从而提高遥感影像分析的准确性和可靠性。方法应用于计算Risk-Screening Environmental Indicators (RSEI),并以此为例。

养乐多的博客 2298

经典面试题之-用两个队列实现一个栈(超详细! 简单易懂!)

使用两个队列来模拟一个栈

yzc的博客 3982

【系统架构设计师-2024下半年真题】案例分析-参考答案及部分详解(完整回忆版)

根据h中描述,为了保证高可靠性,有ping/echo,心跳机制两种策略,从资源利用率问为啥心跳更好。王工觉得使用ping/echo好,但李工觉得从系统资源利用率来说,使用心跳机制好 1、针对质量属性可以使用ping/echo和心跳模式实现,分别简述ping/echo和心跳的实现原理。 2、张工认为心跳策略比较适合,简述为什么?

数据知道的博客 1万+

把 SAP 配置当成一张地图:用 IMG 把实施、变更与治理串成一条清晰的路

摘要 SAP IMG(Implementation Guide)是SAP实施的核心导航体系,它将客户需求转化为系统配置,提供结构化路径和文档化支持。IMG不是简单的菜单树,而是包含业务落地路径、标准化配置活动和文档化知识的实施语言。通过三种视图(Reference、Enterprise、Project)解决不同管理问题,其中Project IMG尤其重要,可管理项目范围、分工和进度。实际工作中应通过SPRO事务码访问IMG,将探索与执行分开管理。案例显示,跨国企业通过Project IMG可有效控制组织架构

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 230

两个队列实现一个栈+两个栈实现一个队列(Java 实现)

两个队列实现一个栈 现有两个队列 q1 和 q2,入栈则将元素加到 q1 出栈的时候先判读 q1 是否为空,除了队列的最后一个元素,将其它元素添加到 q2,q1 的最后一个元素出队 出栈的时候如果在 2 中判断 q1 为空,除了 q2 的最后一个元素,将 q2 中其它元素添加到 q1,然后 q2 中的最后一个元素出队 完整 Java 代码: public class MyStack { ...

jiaobuchong的专栏 2029

基于YOLOv11的人脸识别系统:从构建到应用的全流程指南

深度学习是机器学习的一个分支,旨在通过多层神经网络模拟人脑的认知能力。它能够从大量数据中自动提取特征,并进行准确的预测和分类。在计算机视觉领域,深度学习技术已经取得了显著的成果,尤其是在图像识别、目标检测等方面。YOLOv11是YOLO系列模型的最新版本,结合了卷积神经网络(CNN)和其他创新技术。它在保持高精度的同时,显著提高了推理速度。YOLOv11的结构轻量且高效,非常适合实时目标检测任务。人脸检测的目标是从图像或视频中定位所有人脸的位置。

FJN110的博客 184

C++用两个队列实现栈

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个队列实现一个栈的思想:用dataQueue队列作为push数据的队列,用helpQueue队列暂存数据。 只要是对栈进行push操作,就将数据push入dataQueue队列中。 要实现栈的pop操作,就要在dataQueue队列不为空的情况下,把...

暮日落流年的博客 3309

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

用两个栈实现一个队列&用两个队列实现一个栈

做题之前,我们先来回顾一下“栈和队列的相同点以及不同点”,便于做题时的应用!1.区别与联系相同点:(1)栈和队列都是控制访问点的线性表;              (2)栈和队列都是允许在端点处进行数据的插入和删除的数据结构;不同点:(1)栈遵循“后进先出(LIFO)”的原则,即只能在该线性表的一头进行数据的插入和删除,该位置称为“栈顶”,                        而另外一头...

cherrydreamsover的博客 7万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

两个栈实现一个队列,两个队列 实现一个栈

之前我们对栈和队列的存储结构进行了一些了解,并且实现了栈和队列的一些操作,例如入栈(入队列),出栈(出队列)等。但是我们今天要讨论的是一个经典的面试题,那就是利用两个栈实现一个队列,两个队列实现一个栈。 要想实现这个结构,我们必须先得了解栈和队列的存储结构,以及他们各自的特性,这样我们才能解决问题。 之前栈和队列的实现我已经写过了,今天就直接利用STL库中的stack和queue。 一、两个...

wry_sunny_的博客 559

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

两个栈实现队列

assert(ps);assert(ps);//先检查容量exit(-1);assert(ps);ps->top--;assert(ps);assert(ps);assert(ps);assert(ps);exit(-1);return pq;//将数据尾插到两个队列中不为空的队列,都为空就随便插一个;if (!else。

sysfsv的博客 865

两个队列实现栈,两个栈实现队列

1、两个队列实现栈 思路:有两个队列,一个队列data,一个辅助队列help,我们只把数字加入到data中,在从data弹出元素之前,把最后弹入元素之前的元素先全部压进help栈,然后data再做弹栈操作,就可以使得弹出的是最后一个压入的元素。接着,data和help交换引用,data将除了最后一个元素以外的所有元素全部压进help中,再做弹栈操作。以此类推。 import java.util.L...

mabiao6822的博客 305

两个栈实现队列 OR 两个队列实现栈

两个栈实现队列 解题思路: 队列是先进先出,有队头和队尾,因此用第一个栈的栈顶表示队头,第二个表示队尾。 队列插入的时候是从尾巴插入,因此代表尾部的栈可以定义成一个插入栈也是队尾栈。 队列输出遵守先进先出原则,输出的元素是队头,因此代表头部的栈可以定义一个输出栈也叫队头栈。 为避免队列顺序错乱,因此两个栈在做插入或者输出时应该保持另一个栈为空 图解: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvwv5idB-1597195051181)(file:///C:/Use

SamGeren的博客 1188

两个栈实现一个队列&两个队列实现一个栈【Java实现】

前言 栈 栈是一种线性表,只能在一端进行插入元素(入栈)和删除元素(出栈),通常我们将可以进行入栈出栈的一端称为栈顶,另一端称为栈底。日常生活中一端封闭的山洞就是栈的一个典型例子。 特性:后进先出(LIFO:Last In First Out) 队列 队列也是一种线性表,一端插入元素(入队列),另一端删除元素(出队列),通常我们将可以插入元素的一端称为队尾,可以删除元素的一端称为队...

ty6693的博客 457

C++用两个栈实现队列

1. 基础 队列:先进先出,即插入数据在队尾进行,删除数据在队头进行; 栈:后进先出,即插入与删除数据均在栈顶进行。 2. 思路 两个栈实现一个队列的思想:用pushStack栈作为push数据的栈,用popStack栈作为pop数据的栈。 只要是对队列进行push操作,就将数据push入pushStack栈中。 要实现队列的pop操作,有二点原则,如果popStack为空的话那...

暮日落流年的博客 1704

两个栈实现队列、两个队列实现栈

两个栈实现队列 两个队列实现栈

qq_54102536的博客 232

两个队列实现栈

用两个队列实现栈,并分析相关栈操作的运行时间。 思路同:两个栈实现队列 type DequeStack struct { pushDeque *Deque popDeque *Deque flag bool // true in push, false in pop } func (d *DequeStack) exchange(from, to *Deque) { to.Clean() for true { if v, ok := from.Pop(); ok { to.Push(v

李豆豆的博客 505

【DS】两个队列实现栈&两个栈实现队列@Leetcode —— 栈和队列

本文探讨了如何用栈和队列相互实现对方的数据结构特性。通过两个队列实现栈时,关键在于将前n-1个元素转移到另一个队列,最后弹出剩余元素;而用两个栈实现队列时,则需要将一个栈的元素全部转移到另一个栈以实现先进先出。文章详细分析了两种实现方式的思路,并提供了完整的代码实现,同时强调了内存管理和函数接口设计中的注意事项。这些经典题目展示了数据结构之间的相互转换关系,有助于加深对栈和队列特性的理解。

浮光掠影 6491

使用两个栈实现一个队列

题目:使用两个栈实现一个队列。 栈:后进先出。 队列:先进先出。 入队列:   直接入栈1。 出队列: 返回队列的队尾元素: 返回队列的队头元素: 队列为空:   栈1为空&amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;栈2为空。 队列元素个数:   栈1的元素个数+栈2的元素个数。 参考代码: 设置一个队列由两个栈组成: typedef struct Queue {

zhao_miao的博客 3539

两个栈实现队列+两个队列实现栈----java

两个栈实现队列+两个队列实现栈----java 一.两个栈实现一个队列 思路:所有元素进stack1,然后全部出stack1并进入stack2.实现队列的先进先出即:若stack2非空,我们需要的恰好再栈顶,出栈;若要给队列添加元素,即先进sack1,要出队时,若stack2不为空就出栈,为空时就把stack1全部进栈到stack2 二.两个队列实现一个栈 ps:图

毛毛虫的小哈 1万+
上一篇: 用两个栈实现队列
下一篇: 设计循环队列
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值