栈和队列数据结构的相互实现[LeetCode]
栈是先进后出,队列是先进后出,这里讨论一下两种数据结构之间的相互实现。
一.用两个栈实现队列
我们用一个栈来实现队列的进队操作(栈A),用另一个栈来实现队列的出队操作(栈B)。
1.入队列:
把元素放进栈A即可。假如栈A已满并且栈B为空,可以先把栈A中的所有元素先弹出并放入栈B中;假如栈B不为空,则出错了(不能插入)。
2.出队列:
假如栈B不为空,直接弹出。假如栈B为空,由于队列是先进先出的,因此要出队列时,我们要先把栈A中的元素全部放进栈B中,然后再从栈B中弹出栈顶元素。
3.例子:
进行以下操作:
(1)插入1:
栈A:1
栈B:空
(2)插入2(左边为栈顶):
栈A:2 1
栈B:空
(3)出队列:
栈B为空,先把栈A的元素弹出插入栈B:
栈A:空
栈B:1 2
栈B弹出:
栈A:空
栈B:2
(4)出队列
栈B不为空,直接弹出:
栈A:空
栈B:空
这样,进队列的顺序为1 2,出队列的顺序为1 2,满足队列的特性。
4.LeetCode相关题目
232. Implement Queue using Stacks(https://leetcode.com/problems/implement-queue-using-stacks/description/):
这道题的考虑的东西很少,没考虑一些特殊情况:
#include <iostream>
#include <stack>
using namespace std;
class MyQueue {
public:
stack<int> in;
stack<int> out;
/** Initialize your data structure here. */
MyQueue() {
} /** Push element x to the back of queue. */
void push(int x) {
in.push(x);
} /** Removes the element from in front of queue and returns that element. */
int pop() {
if (!out.empty()) {
int temp = out.top();
out.pop();
return temp;
}
else {
if (in.empty()) {
return -;
}
else {
while (!in.empty()) {
out.push(in.top());
in.pop();
}
int temp = out.top();
out.pop();
return temp;
}
}
} /** Get the front element. */
int peek() {
if (!out.empty()) {
return out.top();
}
else {
if (in.empty()) {
return -;
}
else {
while (!in.empty()) {
out.push(in.top());
in.pop();
}
return out.top();
}
}
} /** Returns whether the queue is empty. */
bool empty() {
return in.empty() && out.empty();
}
}; /**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* bool param_4 = obj.empty();
*/
二.用两个队列实现栈:
1.用队列实现栈有两种方法,两种方法的入栈和出栈的时间复杂度不相同,按需使用:
假设有两个队列,一个队列A,不为空,一个队列B,为空。队列A中的元素符合栈操作的前提。
(1)入栈O(n),出栈(1)
入栈时,直接把元素放进空的队列B,然后把队列A所有的元素按顺序放到队列B中。队列A就变为空了。此时,最后一个“入栈”的元素就成了队列头,需要弹出直接从队列B中弹出即可。这样就满足了栈后进先出的特性了。之后的操作两个队列交替就行了。
(2)入栈O(1),出栈(n)
入栈时,直接把元素放进不为空的队列A的队尾;出栈时,把栈A的前n-1个元素放入栈B中,栈A中剩下一个的元素就是最新插入的元素,直接出队列,也满足栈的特性了。
2.LeetCode相关题目
225. Implement Stack using Queues(https://leetcode.com/problems/implement-stack-using-queues/description/)
这道题用第(1)种方法会快一点,说明出栈操作多一点吧。
方法(1):
class MyStack {
public:
/** Initialize your data structure here. */
queue<int> a;
queue<int> b;
MyStack() { } /** Push element x onto stack. */
void push(int x) {
if (a.empty() && b.empty()) {
a.push(x);
return;
}
if (a.empty()) {
a.push(x);
while (!b.empty()) {
a.push(b.front());
b.pop();
}
}
else {
b.push(x);
while (!a.empty()) {
b.push(a.front());
a.pop();
}
}
} /** Removes the element on top of the stack and returns that element. */
int pop() {
if (a.empty()) {
int temp = b.front();
b.pop();
return temp;
}
else {
int temp = a.front();
a.pop();
return temp;
}
} /** Get the top element. */
int top() {
return a.empty() ? b.front() : a.front();
} /** Returns whether the stack is empty. */
bool empty() {
return a.empty() && b.empty();
}
};
方法(2):
class MyStack {
public:
/** Initialize your data structure here. */
queue<int> a;
queue<int> b;
MyStack() { } /** Push element x onto stack. */
void push(int x) {
if (a.empty() && b.empty()) {
a.push(x);
return;
}
if (!a.empty()) {
a.push(x);
}
if (!b.empty()) {
b.push(x);
}
} /** Removes the element on top of the stack and returns that element. */
int pop() {
if (!a.empty()) {
while (a.size() != ) {
b.push(a.front());
a.pop();
}
int temp = a.front();
a.pop();
return temp;
}
else {
while (b.size() != ) {
a.push(b.front());
b.pop();
}
int temp = b.front();
b.pop();
return temp;
}
} /** Get the top element. */
int top() {
if (!a.empty()) {
while (a.size() != ) {
b.push(a.front());
a.pop();
}
int temp = a.front();
b.push(a.front());
a.pop();
return temp;
}
else {
while (b.size() != ) {
a.push(b.front());
b.pop();
}
int temp = b.front();
a.push(b.front());
b.pop();
return temp;
}
} /** Returns whether the stack is empty. */
bool empty() {
return a.empty() && b.empty();
}
};
栈和队列数据结构的相互实现[LeetCode]的更多相关文章
- 栈和队列数据结构的基本概念及其相关的Python实现
先来回顾一下栈和队列的基本概念: 相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同. 不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性 ...
- 九度OJ 1512 用两个栈实现队列 【数据结构】
题目地址:http://ac.jobdu.com/problem.php?pid=1512 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 输入: 每 ...
- LeetCode 232:用栈实现队列 Implement Queue using Stacks
题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是 ...
- 数据结构和算法(Golang实现)(14)常见数据结构-栈和队列
栈和队列 一.栈 Stack 和队列 Queue 我们日常生活中,都需要将物品排列,或者安排事情的先后顺序.更通俗地讲,我们买东西时,人太多的情况下,我们要排队,排队也有先后顺序,有些人早了点来,排完 ...
- 前、中、后序遍历随意两种是否能确定一个二叉树?理由? && 栈和队列的特点和区别
前序和后序不能确定二叉树理由:前序和后序在本质上都是将父节点与子结点进行分离,但并没有指明左子树和右子树的能力,因此得到这两个序列只能明确父子关系,而不能确定一个二叉树. 由二叉树的中序和前序遍历序列 ...
- 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)
目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...
- 数据结构之栈和队列及其Java实现
栈和队列是数据结构中非常常见和基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用栈和队列相互实现. 栈:栈是一种基于“后进先出”策略的线性表.在 ...
- LeetCode刷题 --杂篇 --数组,链表,栈,队列
武汉加油,中国加油.希望疫情早日结束. 由于疫情,二狗寒假在家不能到处乱逛,索性就在家里系统的刷一下算法的内容,一段时间下来倒也有些小小的收获.只是一来家中的小破笔记本写起博客来实在不是很顺手,二来家 ...
- 详细分析栈和队列的数据结构的实现过程(Java 实现)
目录 栈和队列的数据结构的实现过程(Java 实现) 栈的数据结构的实现 栈的基础知识回顾 栈的常见应用 基于数组的栈的实现 具体代码设计 基于数组的栈简单的时间复杂度分析 关于栈的一个算法应用:括号 ...
随机推荐
- 01_Python简介
Python 简介 *为什么学习python http://bbs.fishc.com/thread-35584-1-1.html Python 特点 易于学习:Python有相对较少的关键字,结构简 ...
- AIO5岗位桌面主页【我的收藏夹】只显示8行,怎样增加显示行?
问题: 为什么主页上的收藏夹只能放8个显示?超出部分显示不出来了?应该怎样操作? 解决方案: 原因分析:桌面区域(系统)内的[我的收藏夹]是固定行高的. 解决方案:通用设置里面去设置[桌面系统模块行数 ...
- 解决thymeleaf layout布局不生效
今天使用thymeleaf layout布局时总是不生效,特此把解决问题的步骤和几个关键点记录下来备忘. 一.检查依赖 1.thymeleaf必备maven依赖: <dependency> ...
- C#学习笔记---数据库连接与异常
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- LINQ学习系列-----2.3 迭代器带来的延迟查询
此篇博文承接上一篇博文: LINQ学习系列-----2.2 迭代器 一.第一次执行 废话不多说,上源码: 执行结果下图: 为什么会这样?其实原因很简单 fro ...
- PHP命令空间namespace及use的用法实践总结
以下皆为本人自我理解内容,如有失误之处,请多多包涵. 文章大纲: 使用namespace的目的 namespace的使用方法 使用use的目的 use的使用方法 使用namespace的目的: 团队合 ...
- 使用docker搭建Jenkins 及slave的配置
安装Jenkins 使用docker docker run -d -p 8080:8080 -p 50000:50000 -v /opt/jenkins_home:/var/jenkins_home ...
- Java IO(2)阻塞式输入输出(BIO)的字节流与字符流
在上文中<Java IO(1)基础知识——字节与字符>了解到了什么是字节和字符,主要是为了对Java IO中有关字节流和字符流有一个更好的了解. 本文所述的输出输出指的是Java中传统的I ...
- 责任链模式(Chain of Responsibility)
责任链模式(Chain of Responsibility)接下来我们将要谈谈责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求 ...
- 51Nod 1084 矩阵取数问题 V2 双线程DP 滚动数组优化
基准时间限制:2 秒 空间限制:131072 KB 一个M*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,先从左上走到右下,再从右下走到左上.第1遍时只能向下和向右走,第2遍时只能向 ...