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

一,使用单链表实现栈

①栈需要一个栈顶指针

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

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

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();
    }
}

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

时间: 2024-12-26 01:05:11

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

栈的实现 与 用两个栈实现队列

栈的实现 /** * 栈的实现:数组 */ class MyStack1<T>{ private T[] data; private int maxLength; private int top; public MyStack1(int maxLength) { this.maxLength = maxLength; this.data= (T[])new Object[maxLength]; top=-1; } public boolean isFull(){ if(top==maxLeng

【剑指Offer】05 - 用两个栈实现队列

重建二叉树 时间限制:1秒 空间限制:32768K 本题知识点:队列 栈 题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); publi

用两个栈创建队列

1.第一种方法: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include<iostream> 3 #include<stack> 4 using namespace std; 5 6 //Pop , push, front, back, empty; 7 template<class T> 8 class MyQueue 9 { 10 public: 11 //判断队列是否为空. empty 12 bool empty() 13 { 1

【干货】容器适配器实现两个栈模拟队列

用两个栈模拟队列的思想就是"倒水思想",这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下: #include<iostream> #include<string> #include<cassert> struct __TrueType//类型萃取 { bool Get() { return true; } }; struct __FalseType { bool Get() { return false

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

今天我们需要学习的是关于数据结构里面经常看到的两种结构,栈和队列.可以说我们是一直都在使用栈,比如说在前面递归所使用的的系统的栈,以及在链表倒序输出时介绍的自定义栈类Stack和使用系统的栈进行递归.那么,在这里我们就讲述一下这两个比较具有特色的或者说关系比较紧密的数据结构之间的互相实现问题. 一:两个栈模拟实现一个队列: 栈的特点是先进后出,然而队列的特点是先进先出. public class Queen(Stack s1,Stack s2){ //实现插入的方法 public void ad

一个数组实现两个栈

//1.两个栈栈头在数组头尾(利用率高) //2.两个栈栈头在数组中间(利用率低) //3.奇偶下标分别为两栈(扩容时复制数据简单) //实现1 template<class T> class Stack { public: Stack() :_array(NULL) , _q1Size(0) , _q2Size(0) , _capacity(0) {} ~Stack() { delete[] _array; _q1Size = _q2Size = _capacity = 0; } void 

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型

import java.util.Stack; /**  * 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型.  * @author user  *  *思路:队列是先入先出,栈是先入后出,可以将数据压入第一个栈后,在弹出来压入第二个栈,弹得时候直接从第二个栈弹出,弹出后又将  *第二个栈中的所有数据弹出重新压入的一个栈  */ public class Solution {     Stack<Integer> stack1 = new Stack<

《剑指offer》之用两个栈实现队列

题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路:把stack1作为主栈,每次有新元素入队,先把stack1中所有元素pop到stack2中暂存,再push新元素到stack1,最后把stack2中元素pop到stack1. 代码实现: 1 import java.util.Stack; 2 3 public class Solution { 4 Stack<Integer> stack1 = new Stack<Integer&g

使用两个栈实现一个队列

使用两个栈Stack1和Stack2来实现一个队列.其中一个栈作为主存放数据的,另外一个栈作为临时存放数据的栈.具体操作如下: enqueue: 栈Stack1的入栈操作. dequeue:将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作.这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出.最后再将Stack2中的元素一个一个地全部依次出栈,填到Stack1中. 实现代码如下: /** *