栈和队列的基本认识

        栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFOLast In First Out)的原则。 压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈:栈的删除操作叫做出栈。出数据在栈顶。要想真正掌握栈,我认为模拟实现栈是一个好方法。

而要实现栈的模拟实现,那么肯定要知道栈有哪些功能,

E push(E e):将 e 入栈,并返回
E pop() :将栈顶元素出栈并返回
E peek() :获取栈顶元素
int size() :获取栈中有效元素个数
boolean empty() :检测栈是否为空
不过栈的模拟实现较为简单,就不展开了,我们只说思路,首先我们要建立一个栈,那么如何建立一个栈呢?我们可以用一个数组来当栈,当我们进行压栈操作时,就将一个数据放入数组中,然后将size的值加一,代表放入一个元素,倘如我们要出栈时,根据栈的特点,我们只需将他的栈顶元素给删除就行,而他的栈顶元素恰好就是我们最后放入的数据,因此我们只需将size减一就行,只要让它不被访问,不就相当于被删除了吗?至于如何获取栈顶位置的元素,那更简单了,毕竟我们的size-1就是栈顶元素的下标。有了下标还不怕找不到元素吗?其他的就不说了,和顺序表的模拟实现没什么区别。
        
        队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为 队尾( Tail/Rear 出队列:进行删除操作的一端称为队头。 Java 中, Queue 是个接口,底层是通过链表实现的。在实例化时必须实例化 LinkedList 的对象,因为 LinkedList 实现了 Queue 接口。而Queue就是队列。与栈一样,可以用顺序表来实现。 既然可以存储元素,那底层肯定要有能够保存元素的空间,通过前面线性表的学习了解到常见的空间类型有两种:顺序结构 和 链式结构 。那么 队列和栈的实现使用顺序结构还是链式结构好?
顺序栈--入栈操作受数组上界的约束有可能发生栈上溢,且需要地址连续的存储单元。
链栈--无须地址连续,便于多个栈共享存储单元,且不存在栈满上溢情况。
顺序队列--需地址连续且有假上溢现象(需改为 循环队列才可解决假上溢)
链式队列--特别适合于数据元素变动比较大的情况,且不存在队列满而产生的溢出问题。
        现在我们已经知道栈和队列的特点,并能用顺序表来实现了,当然用来链表来实现也不是不行,因为这并没什么难度,但是你能用栈实现队列吗?或者用队列实现栈吗?是不是突然有难度起来了,其实这不难,只要我们理清思路就行。那么我们就用队列来实现栈来举例子。首先因为栈的特点是后进先出,而队列的特点是先进先出,因此一个队列显然不能实现队列,我们得需要两个队列。为了方便,我们将这个队列分别定义为队列1和队列2。当我们放入元素时,我们可以先将元素放入到队列1里,而当我们要取出元素或删除元素时,我们可以将队列1里的元素都取出,然后将其放入队列2直到队列1里还剩下一个元素时我们在将它取出,如果是删除,则不将它放入队列2,如果是取最顶端的,则将它放入队列2然后直接返回。等我们还要放入元素时,则放入到有元素的队列中,而取出时则将其他元素放到队列为空的那个队列。如果我们要判断该栈是否为空时,只需要判断这两个队列是否都为null,其他细节我就不一一补充了,我们先实现放入和删除的代码。
public Queue queue1 = new LinkedList<>();
public Queue queue2 = new LinkedList<>();

public boolean push(int val){
    if(queue1.isEmpty() && queue2.isEmpty()){
        queue1.add(val);
    }else if(queue1.isEmpty()){
        queue2.add(val);
    }else{
        queue1.add(val);
    }
    return true;
}

public int pop(){
    if(queue1.isEmpty()){
        int size = queue2.size();
        for(int i = size; i < size - 1; i++){
            int del = queue2.poll();
            queue1.add(del);
        }
        return queue2.poll();
    }else {
        int size = queue1.size();
        for(int i = size; i < size - 1; i++){
            int del = queue1.poll();
            queue2.add(del);
        }
        return queue1.poll();
    }
}
写的较为粗糙,还请见谅,队列实现栈实现了,那么栈实现队列你是否可以实现呢?

你可能感兴趣的:(java,数据结构)