首页 > 其他分享 >用栈实现队列

用栈实现队列

时间:2024-03-10 10:13:42浏览次数:24  
标签:int 队列 top pop 实现 用栈 push stack2 stack1

用栈实现队列,需要两个栈,一个定义为stackIn,另一个定义为stackOut
牛客NC76 用两个栈实现队列

1、队列的push()操作

这个直接将数据压入stcakIn,就行

void push(int node) {
	stackIn.push(node);
}

2、队列的pop()操作

这里有两种解法

解法一:

当stcakOut为空时再将stackIn中的数据全部压入stackOut,当stackOut不为空时,直接stackOut.pop()就行

int pop() {
// 只有当stOut为空的时候,再从stIn里导入数据(导入stIn全部数据)
	if (stOut.empty()) {
// 从stIn导入数据直到stIn为空
		while(!stIn.empty()) {
			stOut.push(stIn.top());
			stIn.pop();
		}
	}
	int result = stOut.top();
	stOut.pop();
	return result;
}

解法二:

每次出栈后直接将stack.Out数据全部压回stack.In

int pop() {
//将第一个栈中内容弹出放入第二个栈中
	while (!stack1.empty()) {
		stack2.push(stack1.top());
		stack1.pop();
	}
//第二个栈栈顶就是最先进来的元素,即队首
	int res = stack2.top();
	stack2.pop();
//再将第二个栈的元素放回第一个栈
	while (!stack2.empty()) {
		stack1.push(stack2.top());
		stack2.pop();
	}
	return res;
}

之所以这样操作是因为队列不是一次性全部输入再全部输出,也就是说pop()后会接push()也会接pop()。

完整代码:

class Solution {
    stack<int> stackIn;
    stack<int> stackOut;
  public:
    void push(int node) {
        stackIn.push(node);
    }

//解法一:
    int pop() {
        if (stackOut.empty()) {
            while (!stackIn.empty()) {
                stackOut.push(stackIn.top());
                stackIn.pop();
            }
        }
        int result = stackOut.top();
        stackOut.pop();
        return result;
    }

//解法二:
	int pop() {
        //将第一个栈中内容弹出放入第二个栈中
        while (!stack1.empty()) {
            stack2.push(stack1.top());
            stack1.pop();
        }
        //第二个栈栈顶就是最先进来的元素,即队首
        int res = stack2.top();
        stack2.pop();
        //再将第二个栈的元素放回第一个栈
        while (!stack2.empty()) {
            stack1.push(stack2.top());
            stack2.pop();
        }
        return res;
    }

  private:
    stack<int> stack1;
    stack<int> stack2;
};

标签:int,队列,top,pop,实现,用栈,push,stack2,stack1
From: https://www.cnblogs.com/haof31/p/18063774

相关文章

  • 使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力
    文章信息标题:使用C#和MemoryCache组件实现轮流调用APIKey以提高并发能力的技巧摘要:本文介绍了如何利用C#语言中的MemoryCache组件,结合并发编程技巧,实现轮流调用多个APIKey以提高系统的并发能力。通过示例代码和详细说明,读者将了解如何有效地管理APIKey的调用次数限制,并优化系......
  • 量子力学2-量子力学的应用与实现
    by东北育才学校S361qjc0714我们熟知,人类历史上有几次重要的工业革命,推进了人们科技的发展:工业1.0是蒸汽机时代,工业2.0是电气化时代,工业3.0是信息化时代,而工业4.0则是利用信息化技术促进产业变革的时代,也就是智能化时代.量子力学的诞生为人类未来的工业4.0打下了基础.1980年......
  • 使用AT+MQTT指令连接华为云实现数据上传
    1准备工作硬件设备模块:ESP-01-S固件烧录工具:ESP8266下载器串口调试工具:VOFA+参考文章:stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与下发的命令处理2固件更新2.1为什么要重新安装固件由于ESP-01-S模块出厂没有集成MQTT指令,故需要自己下载固件包,详见官网固......
  • 2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从 0 开始编号, 每个栈
    2024-03-09:用go语言,我们把无限数量的栈排成一行,按从左到右的次序从0开始编号,每个栈的的最大容量capacity都相同。实现一个叫「餐盘」的类DinnerPlates,DinnerPlates(intcapacity)-给出栈的最大容量capacity,voidpush(intval)将给出的正整数val推入从左往右第一个......
  • delphi 判断类是否实现接口,获取类实现的接口
    判断类是否实现接口,获取类实现的接口代码typeICeShi=interface['{37CABB9D-CAA2-4589-A0C8-5AA1424E525B}']functionToPrint:string;end;TCeShi=class(TInterfacedObject,ICeShi)functionToPrint:string;end;procedureTForm1.Button1Cli......
  • 扇区级别访问是指直接读取或写入硬盘上的单个扇区,而不是按文件或目录进行访问。下面是
    扇区级别访问是指直接读取或写入硬盘上的单个扇区,而不是按文件或目录进行访问。下面是扇区级别访问的技术实现原理:硬盘控制器:硬盘控制器是负责管理硬盘读写操作的组件。它负责接收来自主机的指令,并将其转换为硬盘可以理解的命令。硬盘控制器通过与硬盘上的磁头和扇区进行交......
  • Python基于TCP实现聊天功能
    Server端importsocketimportqueueimportthreadingimporttimeserversocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=socket.gethostname()print("服务器IP:"+socket.gethostbyname(host))serversocket.bind((host,9090))serversock......
  • Qt 使用第三方libmodbus库实现Modbus通讯
    之前发表的Modbus通讯程序使用了QT自带的Modbus库,由于QT自带库的数据响应使用的是信号和槽来实现的,所以在一些读写频率较高的场景下,会引发很多异常问题,此篇文章使用C语言写的第三方Modbus库来实现modbus通讯。 经程序运行测试,调用该库进行modbus通讯完虐QT自带mosbus库。......
  • ubuntu c语言 opencv实现h265 编码
    在Ubuntu上使用C语言和OpenCV实现H.265编码,你可以遵循以下步骤:安装依赖:首先确保你的系统已经安装了Ubuntu最新版本,并更新所有包列表。安装FFmpeg,因为OpenCV使用FFmpeg来处理视频编码。可以使用以下命令安装:复制sudoaptupdatesudoaptinstallffmpeg安装OpenCV:OpenCV库本......
  • schedule 取消任务怎么实现
    点击查看代码importtimeimportthreadingimportscheduleschedule.every(10).seconds.do(job)#每隔10分钟运行一次job函数schedule.every(10).minutes.do(job)#每隔10分钟运行一次job函数schedule.every().hour.do(job)......