自定义栈的实现及使用两个栈模拟队列

hapjin hapjin     2022-07-30     551

关键词:

一,使用单链表实现栈

①栈需要一个栈顶指针

②栈的基本操作有出栈和入栈,以及判断栈是否为空

③单链表中每个结点表示一个栈元素,每个结点有指向下一个结点的指针。因此,在栈内部需要实现一个单链表。代码如下:

public class Stack<T extends Comparable<? super T>>{
    private class Node{
        T ele;
        Node next;
        
        public Node(T ele) {
            this.ele = ele;
        }
    }
    
    Node top;//栈顶指针
    
    public void push(T ele){
        Node n = new Node(ele);
        n.next = top;
        top = n;
    }
    public T pop(){
        if(top != null)
        {
            Node tmp = top.next;
            T ele = top.ele;
            top.next = null;
            top = tmp;
            return ele;
        }
        return null;
    }
    
    public boolean isEmpty(){
        return top == null;
    }
}

 

二,使用两个栈实现队列

①栈是先进后出,而队列是先进先出。要实现队列,就需要实现队列的基本操作,并使基本操作满足先进先出的特点。

这里需要两个栈,一个是enStack,当有元素入队列时,一律Push到这个栈中。另一个栈是deStack,当有元素出队列时:

先检查deStack是否为空,若不为空,则从deStack中pop元素出去,作为出队列的元素。当deStack为空时,将enStack中的元素出栈,放push进deStack中,然后再从deStack中出栈。

如果enStack 和 deStack 都为空,则出队列操作返回null,代码实现如下:

public class MyQueue<T extends Comparable<? super T>> {
    private Stack<T> enStack;
    private Stack<T> deStack;
    
    public MyQueue() {
        enStack = new Stack<T>();
        deStack = new Stack<T>();
    }
    
    public void enqueue(T ele){
        enStack.push(ele);
    }
    
    public T dequeue(){
        if(!deStack.isEmpty())
        {
            return deStack.pop();
        }
        while(!enStack.isEmpty()){
            deStack.push(enStack.pop());
        }
        return deStack.pop();
    }
    
    public boolean isEmpty(){
        return enStack.isEmpty() && deStack.isEmpty();
    }
}

 

总结:不管是用栈模拟队列,还是用队列模拟栈,其本质都是如何一种数据结构的特性去实现另一种数据结构的特性。

剑指offer:两个队列模拟一个栈(代码片段)

题目描述用两个队列来实现一个栈,完成栈的Push和Pop操作。队列中的元素为int类型。实现方式其实和两个栈模拟一个队列相似,但是区别在于这两个队列的作用和那两个栈的作用不一样。classSolution:"""用两个队列模拟一个栈,如... 查看详情

leetccode225.用队列实现栈(两个队列模拟)(代码片段)

使用队列实现栈的下列操作:push(x)--元素x入栈pop()--移除栈顶元素top()--获取栈顶元素empty()--返回栈是否为空注意:你只能使用队列的基本操作--也就是 pushtoback,peek/popfromfront,size,和 isempty 这些操作是合法的。你所使用的... 查看详情

剑指offer.用两个栈实现队列(代码片段)

...首元素;empty()–返回队列是否为空;注意:你只能使用栈的标准操作:pushtotop,peek/popfromtop,size和isempty;如果你选择的编程语言没有栈的标准库,你可以使用list或者deque等模拟栈的操作;输入数据保证合法, 查看详情

数据结构和算法之栈和队列一:两个栈模拟一个队列以及两个队列模拟一个栈

...归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归。那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题。     &... 查看详情

使用两个栈实现一个队列

...将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作。这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出。最 查看详情

剑指offer:用两个栈实现一个队列(代码片段)

...为int类型。类似汉诺塔,当我们需要将栈A下面的元素出栈的时候可以先将栈A中的元素全部逆序压入到另一个栈B,这时栈B保存的就是栈A的逆序,也就是满足了FIFO的要求classSolution:"""用两个栈模拟一个队列,如果两个栈的容量分... 查看详情

第三章:1.栈和队列--栈的表示及实现

...现  4、队列  5、离散事件模型 正文:  栈的定义    栈 查看详情

队列4:栈实现队列和队列实现栈(代码片段)

​栈的特点是后进先出,队的特点是先进先出。两个栈将底部拼接到一起就能实现队列的效果,通过队列也能实现栈的功能。在很多地方能看到让你通过两个栈实现队列的题目,也有很多地方是两个队列实现栈的题目... 查看详情

用两个栈实现队列(代码片段)

...,第一个栈存储元素,第二个栈用于辅助操作。  根据栈的特性,第一个栈的底部元素是最后插入的元素,第一个栈的顶部元素是下一个被删 查看详情

225.用队列实现栈简单队列模拟(代码片段)

...实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop和empty)。实现MyStack类:voidpush(intx)将元素x压入栈顶。intpop()移除并返回栈顶元素。inttop()返回栈顶元素。booleanempty()如果栈是空... 查看详情

栈的实现与用两个栈实现队列(代码片段)

栈的实现/***栈的实现:数组*/classMyStack1<T>privateT[]data;privateintmaxLength;privateinttop;publicMyStack1(intmaxLength)this.maxLength=maxLength;this.data=(T[])newObject[maxLength];top=-1;publicboolean 查看详情

栈和队列的常见题型

...个队列实现一个栈 4.元素出栈、入栈顺序的合法性。如入栈的序列(1,2,3,4,5),出栈序列为(4,5,3,2,1) 5.一个数组实现两个栈。二、解法分析及示例代码1.第一题前两种操作Push(出栈)、Pop(入栈)比较好实现,也是栈 查看详情

剑指offer-5.用两个栈实现队列(c++/java)(代码片段)

...成队列的Push和Pop操作。队列中的元素为int类型。分析:栈的特点是先进后出,队列的特点则是先进先出。题目要求我们用两个栈来实现一个队列,栈和队列都有入栈(入队)的操作,所以我们可以使用一个栈来模拟入队的操作,另... 查看详情

使用两个栈模拟一个队列

...一个栈”,这里该如何使用两个栈模拟一个队列呢?具体实现如下:1publicclassQueue<E>{2privateStack<E>s1=null;//s1作为插入栈3privateStack<E>s2=null;//s2作为弹出栈45publicQueue(){6s1=newStack<E>();7s2=newStac 查看详情

用两个栈实现队列

栈的特点是后进先出,即最后别呀如栈的元素会第一个被弹出(pop)。队列是另外一个很重要的数据结构。和栈不同的是,队列的特点是先进先出,即第一个进入队列的元素将会第一个出来。题目:用两个栈是新啊一个队列。队... 查看详情

051栈与队列栈的实现与stack类

 1///<summary>2///自定义栈3///</summary>4classCStack{56///<summary>7///存储数据的数组8///</summary>9privateArrayListm_arrayList;10///<summary>11///栈顶索引12///</summary>13pr 查看详情

新手向c语言实现特殊的数据结构——栈(含用两个栈实现队列)(代码片段)

...2.2返回栈顶数据三、头文件的引用,结构体和函数的定义四、拾枝杂谈——用两个栈实现队列4.1队列结构体声明4.2队列初始化4.3入队4.4出队4.5取队头数据4.6判断队列是否为空4.7销毁队列一、易错接口详解1.1栈的初始化涉及到... 查看详情

新手向c语言实现特殊的数据结构——栈(含用两个栈实现队列)(代码片段)

...2.2返回栈顶数据三、头文件的引用,结构体和函数的定义四、拾枝杂谈——用两个栈实现队列4.1队列结构体声明4.2队列初始化4.3入队4.4出队4.5取队头数据4.6判断队列是否为空4.7销毁队列一、易错接口详解1.1栈的初始化涉及到... 查看详情