栈和队列数据结构的相互实现[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 -1;
            }
            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 -1;
            }
            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() != 1) {
                b.push(a.front());
                a.pop();
            }
            int temp = a.front();
            a.pop();
            return temp;
        }
        else {
             while (b.size() != 1) {
                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() != 1) {
                b.push(a.front());
                a.pop();
            }
            int temp = a.front();
            b.push(a.front());
            a.pop();
            return temp;
        }
        else {
             while (b.size() != 1) {
                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();
    }
};

原文地址:https://www.cnblogs.com/fengziwei/p/8157557.html

时间: 2024-10-04 00:17:51

栈和队列数据结构的相互实现[LeetCode]的相关文章

栈和队列数据结构

栈和队列都是常用的数据结构.栈的应用非常的广泛,其原理也是非常经典的. 一.栈 ①栈(stack)又名堆栈,他是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一段被称为栈顶,相对地,把另一端称为栈底. ②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后出来(先进后出→FILO----FirstIn/LastOut) ③栈是操作系统在建立某个进程时或者线程(在支持多线程的操作系统是线程)为这个线程建立的存储区域,该区域具有FIFO的特性,在编译的时候可以指定

栈和队列数据结构的基本概念及其相关的Python实现

先来回顾一下栈和队列的基本概念: 相同点:从"数据结构"的角度看,它们都是线性结构,即数据元素之间的关系相同. 不同点:栈(Stack)是限定只能在表的一端进行插入和删除操作的线性表. 队列(Queue)是限定只能在表的一端进行插入和在另一端进行删除操作的线性表.它们是完全不同的数据类型.除了它们各自的基本操作集不同外,主要区别是对插入和删除操作的"限定". 栈必须按"后进先出"的规则进行操作:比如说,小学老师批改学生的作业,如果不打乱作业本的顺

栈和队列数据结构博客园

1.本周学习总结(0--1分) 谈谈你对栈和队列结构的认识及学习体会. 体会:本章学习了栈和队列,堆栈和队列都是特殊的线性表,其数据元素以及数据元素之间的逻辑关系完全相同, 区别在于:线性表的插入和删除操作不受限制,堆栈只能在栈顶插入和删除,队列只能在队尾插入,在队头删除. 栈的特点还是非常有意思的,对于解决迷宫问题时有很好的 作用,栈的结构能保证迷宫问题中指针神时候进 去什么时候出来,通过保存从入口到当前位置的路径上走过的方块,可以保证所有位置可以原路返回.总之, 对于栈和队列的知识的初步了解

数据结构实验三《栈和队列》

<数据结构>实验三 栈和队列 一.实验目的 巩固栈和队列数据结构,学会运用栈和队列. 1.回顾栈和队列的逻辑结构和受限操作特点,栈和队列的物理存储结构和常见操作. 2.学习运用栈和队列的知识来解决实际问题. 3.进一步巩固程序调试方法. 4.进一步巩固模板程序设计. 二.实验时间 准备时间为第5周到第6周,具体集中实验时间为6周第2次课.2个学时. 三.实验内容 1.自己选择顺序或链式存储结构,定义一个空栈类,并定义入栈.出栈.取栈元素基本操作.然后在主程序中对给定的N个数据进行验证,输出各个

LeetCode 232:用栈实现队列 Implement Queue using Stacks

题目: 使用栈实现队列的下列操作: push(x) -- 将一个元素放入队列的尾部. pop() -- 从队列首部移除元素. peek() -- 返回队列首部的元素. empty() -- 返回队列是否为空. Implement the following operations of a queue using stacks. push(x) -- Push element x to the back of queue. pop() -- Removes the element from in

Leetcode题解——数据结构之栈和队列

1. 用栈实现队列 2. 用队列实现栈 3. 最小值栈 4. 用栈实现括号匹配 5. 数组中元素与下一个比它大的元素之间的距离 6. 循环数组中比当前元素大的下一个元素 1. 用栈实现队列 232. Implement Queue using Stacks (Easy) 栈的顺序为后进先出,而队列的顺序为先进先出.使用两个栈实现队列,一个元素需要经过两个栈才能出队列,在经过第一个栈时元素顺序被反转,经过第二个栈时再次被反转,此时就是先进先出顺序. class MyQueue { private

数据结构之栈和队列及其Java实现

栈和队列是数据结构中非常常见又非常基础的线性表,在某些场合栈和队列使用很多,因此本篇主要介绍栈和队列,并用Java实现基本的栈和队列,同时用两个栈实现队列和用两个队列实现栈. 栈:栈是一种基于"后进先出"策略的线性表.在插入时(入栈),最先插入的元素在栈尾,最后插入的元素在栈顶:在删除时(出栈),最后插入的元素先出栈,最先插入的元素最后出栈.由此可见,对栈的插入和删除操作都是在栈顶位置进行的. 在Java中,提供了一个类Stack<E>来实现栈的这些特性,并提供了一些常用的

【数据结构】3. 栈和队列

目录 3.1 栈 3.1.1 栈的基本概念 (1)栈的定义 (2)栈的基本操作 3.1.2 栈的顺序存储结构 (1)顺序栈的实现 (2)栈的基本运算 (3)共享栈 3.1.3 栈的链式存储结构 3.2 队列 3.2.1 队列的基本概念 (1)队列的定义 (2)队列常见的基本操作 3.2.2 队列的顺序存储结构 (1)队列的順序存储 (2)循环队列 (3)循环队列的操作 3.2.3 队列的链式存储结构 (1)队列的链式存储 (2)链式队列的基本操作 3.2.4 双端队列 3.3 栈和队列的应用 3

3-3-行编辑程序-栈和队列-第3章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第3章  栈和队列 - 行编辑程序 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? SequenceStack.c        相关测试数据下载  链接? 无数据