用两个栈实现队列

两个栈模拟一个队列、两个队列模拟一个栈 1、两个栈模拟一个队列 2、两个队列模拟一个栈 阅读详情

1.栈的基本实现代码

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

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}

void STDestroy(ST* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;
}
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

void STPop(ST* pst)
{
	assert(pst);
	pst->top--;
}
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);

	return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;
}
int STSize(ST* pst)
{
	assert(pst);
	return pst->top;
}

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

2.初始化队列

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


typedef struct MyQueue{
	ST S1;
	ST S2;
} MyQueue;
MyQueue* myQueueCreate() {
	MyQueue* Queue = (MyQueue*)malloc(sizeof(MyQueue));
	if (Queue == NULL)
	{
		perror("malloc");
	}
	STInit(&Queue->S1);
	STInit(&Queue->S2);
	return Queue;
}

3.队列出入数据 

因为栈的性质我们需要一个栈在入数据时接收所有数据在出数据时另外一个栈接收所有数据

左边时如数据时的栈情况,右边是出数据时栈的情况

当我们接收数据时就用S1来直接接收

当我们出数据时将S1里面的N-1个传给S2再将S1中剩余的一个数据删除

然后再将S2中的数据传输给S1

代码实现

void myQueuePush(MyQueue* obj, int x) {
	STPush(&obj->S1, x);
}
int myQueuePop(MyQueue* obj) {
	while (STSize(&obj->S1) > 0)
	{
		STPush(&obj->S2, STTop(&obj->S1));
		STPop(&obj->S1);
	}
	int TOP = STTop(&obj->S2);
	STPop(&obj->S2);
	while (STSize(&obj->S2) > 0) 
	{
		STPush(&obj->S1, STTop(&obj->S2));
		STPop(&obj->S2);
	}
	return TOP;
}

4.返回对头数据

返回对头数据和出数据差不多但是s1中留下的那个数据不能删除

代码实现

int myQueuePeek(MyQueue* obj) {
	while (STSize(&obj->S1) > 1)
	{
		STPush(&obj->S2, STTop(&obj->S1));
		STPop(&obj->S1);
	}
	int TOP = STTop(&obj->S1);
	while (STSize(&obj->S2) > 0)
	{
		STPush(&obj->S1, STTop(&obj->S2));
		STPop(&obj->S2);
	}
	return TOP;
}

 5.判断队列是否为空

判断队列是否为空只要判断队列中的S1是否为空就行了

bool myQueueEmpty(MyQueue* obj) {
	return STEmpty(&obj->S1);
}

6.队列的空间释放

void myQueueFree(MyQueue* obj) {
	STDestroy(&obj->S1);
	STDestroy(&obj->S2);
	free(obj);
}

7.整体代码

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<assert.h>

typedef int STDataType;

typedef struct Stack
{
	STDataType* a;
	int top;
	int capacity;
}ST;
typedef struct MyQueue{
	ST S1;
	ST S2;
} MyQueue;
void STInit(ST* pst)
{
	assert(pst);
	pst->a = NULL;
	pst->top = 0;
	pst->capacity = 0;
}

void STDestroy(ST* pst)
{
	assert(pst);

	free(pst->a);
	pst->a = NULL;
	pst->top = pst->capacity = 0;
}
void STPush(ST* pst, STDataType x)
{
	assert(pst);
	if (pst->top == pst->capacity)
	{
		int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
		STDataType* tmp = (STDataType*)realloc(pst->a, newcapacity * sizeof(STDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		pst->a = tmp;
		pst->capacity = newcapacity;
	}
	pst->a[pst->top] = x;
	pst->top++;
}

void STPop(ST* pst)
{
	assert(pst);
	pst->top--;
}
STDataType STTop(ST* pst)
{
	assert(pst);
	assert(pst->top > 0);

	return pst->a[pst->top - 1];
}
bool STEmpty(ST* pst)
{
	assert(pst);

	return pst->top == 0;
}
int STSize(ST* pst)
{
	assert(pst);
	return pst->top;
}
MyQueue* myQueueCreate() {
	MyQueue* Queue = (MyQueue*)malloc(sizeof(MyQueue));
	if (Queue == NULL)
	{
		perror("malloc");
	}
	STInit(&Queue->S1);
	STInit(&Queue->S2);
	return Queue;
}
void myQueuePush(MyQueue* obj, int x) {
	STPush(&obj->S1, x);
}
int myQueuePop(MyQueue* obj) {
	while (STSize(&obj->S1) > 0)
	{
		STPush(&obj->S2, STTop(&obj->S1));
		STPop(&obj->S1);
	}
	int TOP = STTop(&obj->S2);
	STPop(&obj->S2);
	while (STSize(&obj->S2) > 0) 
	{
		STPush(&obj->S1, STTop(&obj->S2));
		STPop(&obj->S2);
	}
	return TOP;
}
int myQueuePeek(MyQueue* obj) {
	while (STSize(&obj->S1) > 1)
	{
		STPush(&obj->S2, STTop(&obj->S1));
		STPop(&obj->S1);
	}
	int TOP = STTop(&obj->S1);
	while (STSize(&obj->S2) > 0)
	{
		STPush(&obj->S1, STTop(&obj->S2));
		STPop(&obj->S2);
	}
	return TOP;
}
bool myQueueEmpty(MyQueue* obj) {
	return STEmpty(&obj->S1);
}
void myQueueFree(MyQueue* obj) {
	STDestroy(&obj->S1);
	STDestroy(&obj->S2);
	free(obj);
}

两个栈实现一个队列&两个队列实现一个栈 Hello,今天Val来给大家分享关于利用栈实现队列和利用队列来实现一个栈。准备知识1、栈 特点: 栈顶插入数据,栈顶删除数据 LIFO(last in first out)后进先出 2、队列 特点: 队列队头删除数据,队尾插入数据 FIFO(first in first out)先进先出一、那么如何利用两个栈实现一个队列? 我们知道不管是在队列中插入数据,还是删除数 阅读详情

相关推荐

NACA0012的O型网格求解

本篇文章采用偏微分方程数值解法生成NACA0012翼型O型网格,并采用速度势方程求解绕NACA0012翼型迎角为0度时的低速不可压无粘流场。 文章目录一、求解网格1.翼型2.远场3.网格4.迭代5.求解二、求解流场1.偏微分方程2.迭代求解流场三、求解参数1.偏微分方程2.迭代求解四、导出数据 一、求解网格 1.翼型 本次求解网格和流场等采用的是NACA0012(修形)对称翼型,在NACA四位翼型中,第一位数字代表的是弯度,第二位数字代表的是弯度位置,后两位数字代表的是厚度,由于本次翼型的前两位数字都为0,

m0_50746433的博客 6677

两个栈模拟实现队列

用两个栈模拟实现队列

m0_63020222的博客 1万+

SpringBoot实现电子发票生成

电子发票是近年来比较流行的一种票据形式,它取代了以往传统的纸质发票,具有减少纸张浪费、方便有效查验等优点。本文将介绍如何使用Spring Boot和Vue.js构建一个仿真电子发票生成应用程序,借助微信二维码扫描功能和第三方库,实现用户扫描二维码获取发票信息并填写相关开票信息,最后生成电子发票。在本文中,我们介绍了如何使用Spring Boot和Vue.js构建一个仿真电子发票生成应用程序,借助微信二维码扫描功能和第三方库,实现用户扫描二维码获取发票信息并填写相关开票信息,最后生成电子发票。

不愧是暮言的博客 6093

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

在数据结构中,栈和队列是较为常见的两种数据结构。。那怎么用栈去实现队列呢?此问题在面试中也是高频出现的问题。本篇文章会给出详细解释。

weixin_67596609的博客 4507

Ubuntu24.04LTS上Ollama GPU加速配置指南:从驱动安装到多卡均衡负载

本文详细介绍了在Ubuntu24.04LTS系统上配置Ollama GPU加速的完整指南,包括NVIDIA驱动安装、CUDA Toolkit配置、Ollama在线与离线安装方法,以及多GPU负载均衡优化策略。通过实战案例和性能调优建议,帮助开发者充分利用硬件资源提升大型语言模型的运行效率。

weixin_29255731的博客 761

关于RTP时间戳以及播放器对时间戳的处理

首先,了解时间戳几个基本概念: 时间戳单位:时间戳计算的单位不是秒之类的单位,而是由采样频率所代替的单位,这样做的目的就是为了是时间戳单位更为精准。比如说一个音频的采样频率为8000Hz,那么我们可以把时间戳单位设为1 / 8000。 时间戳增量:相邻两帧之间的时间差(以时间戳单位为基准)。 采样频率: 有些地方也叫时钟频率,即 每秒钟抽取样本的次数,例如音频的采...

toshiba689的专栏 3052

栈实现队列

题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 1、Javascript解法 var stack1=[]; var stack2 = []; function push(node) { // write code here stack1.push(node); } function pop() { // write code here if (stack2.length===0){ while(stack

Z___R的博客 197

超越图灵机——论人工智能实现的可能性(一)

超越图灵机——论人工智能实现的可能性(一)我认为人工智能是可以实现到逻辑思维这一步的,因为逻辑思维可以完全用字符串来表示,图灵机可以把任意单元置成任意值,在这一点上是完备的,这就足以描述逻辑思维了,所以用图灵机完全可以实现到逻辑思维。当然图灵机会受到哥德尔不完备性的制约,但是逻辑系统也会受到同样的制约,所以我认为完全可以用图灵机实现逻辑思维。那么逻辑思维的本质机理与图灵机是什么关系?逻辑思

太极语言 1万+

用双栈实现队列,巧妙运用栈原理模拟队列特性

使用双栈结构实现队列、巧妙运用栈的先入后出原理、模拟实现队列的先进先出特性

weixin_44196733的博客 380

路径规划 | 图解RRT*算法(附ROS C++/Python/Matlab仿真)

RRT*算法针对传统RRT算法进行了渐进最优改进,在添加节点到搜索树的过程中进行重连选择。本文图解RRT*算法原理,并采用ROS C++、Python、Matlab三种语言实现算法,加深理解

FRIGIDWINTER的博客 9408

Open3D (C++) 计算点云坐标最值及其索引

使用C++版本的Open3D计算点云最值点及其对应的下标索引

点云侠的博客 731

C++用两个队列实现栈

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

暮日落流年的博客 3309

手把手教你学AI GPU的UMD驱动软件开发专栏简介

通过本专栏的学习,您将掌握UMD的核心概念、开发环境搭建、API实现、内存管理和同步技术,以及在实际AI场景中的应用。通过本专栏的学习,您将不仅掌握UMD驱动开发的核心技术,还将能够将这些技术应用到实际的AI应用场景中,为您的AI应用提供更高效的硬件加速支持。无论您是想开发自己的AI加速框架,还是希望深入理解现有AI加速库的工作原理,本专栏都将为您提供宝贵的知识和实践经验。:本专栏不仅讲解UMD驱动的核心概念,还通过精心设计的实战案例,引导您从零开始构建UMD驱动,真正掌握AI GPU驱动开发的技能。

MHD0815的博客 115

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

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

jiaobuchong的专栏 2029

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

wry_sunny_的博客 559

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

两个栈实现队列

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

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

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

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

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

ty6693的博客 457

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

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

SamGeren的博客 1188

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

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

mabiao6822的博客 305

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

使用两个栈实现一个队列

题目:使用两个栈实现一个队列。 栈:后进先出。 队列:先进先出。 入队列:   直接入栈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

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

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

浮光掠影 6491

【使用两个队列实现栈】

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

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

python两个栈实现一个队列_用两个栈实现队列与用两个队列实现栈(Python实现)...

用两个栈实现队列:class QueueWithTwoStacks(object):def __init__(self):self._stack1 = []self._stack2 = []def appendTail(self,x):self._stack1.append(x)def deleteHead(self):if self._stack2:return self._stack2.pop...

weixin_35947806的博客 482
上一篇: 栈:括号匹配问题
下一篇: 用两个队列实现栈
Arcane Code
博客等级 码龄3年 598粉丝 101原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值