算法数据与结构——栈和队列

DBC 1.6K 0

一、什么是栈?

算法数据与结构——栈和队列插图

二、栈的实现

算法数据与结构——栈和队列插图2

从用户的角度来看,支持这些操作就好

具体底层实现,用户不关心

实际底层有多种实现方式

代码实现

避免篇幅过长,这个Array就隐藏起来

点击查看完整内容

package stack;

public class ArrayStack<E> implements Stack {
    Array<E> array;

    public ArrayStack(int capacity){
        array = new Array<E>(capacity);
    }
    public ArrayStack(){
        array = new Array<E>();
    }

    /**
     * 获取数组容量
     * @return
     */
    public int getCapacity(){
        return array.getCapacity();
    }
    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    @Override
    public void push(Object o) {
        array.addLast((E) o);
    }


    @Override
    public E pop(){
        return array.removeLast();
    }
    @Override
    public E peek(){
        return array.getLast();
    }
    @Override
    public String toString (){
        StringBuilder res = new StringBuilder();
        res.append("Stack: ");
        res.append("【");
        for (int i = 0;i<array.getSize();i++){
            res.append(array.get(i));
            if (i!= array.getSize()-1){
                res.append(",");
            }
        }
        res.append("】 top");
        return res.toString();
    }
}
public interface Stack<E> {
    int getSize();
    boolean isEmpty();
    void push(E e);
    E pop();
    E peek();
}
让我们来测试一下
public class Main {
    public static void main(String[] args) {
        ArrayStack<Integer> stack = new ArrayStack<>();
        for (int i = 0;i<5;i++){
            stack.push(i);
            System.out.println(stack);
        }
        stack.pop();
        System.out.println(stack);
    }

}
控制台输出

时间复杂度

算法数据与结构——栈和队列插图4

三、栈的小练习

这里我们举例力扣(LeetCode)算法练习第20题——有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

具体代码如下

package stack;
import java.util.Stack;
public class Solution {
    public boolean isValid(String s){
        Stack<Character> stack = new Stack<Character>();
        for (int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if (c == '(' || c== '['|| c== '{')
                stack.push(c);
            else {
                if (stack.isEmpty())
                    return false;

                char topChar = stack.pop();
                if (c==')' && topChar != '(')
                    return false;
                if (c==']' && topChar != '[')
                    return false;
                if (c=='}' && topChar != '{')
                    return false;
            }
        }
        return stack.isEmpty();
    }
}

可以看到,在力扣测试也是成功的

算法数据与结构——栈和队列插图6

四、队列

什么是队列

算法数据与结构——栈和队列插图8

队列的实现

算法数据与结构——栈和队列插图10

代码小例子如下:

温馨提示

代码所需要的Array数组在文章最上面隐藏代码中,这里不再放出!

package Queue;

public class ArrayQueue<E> implements Queue {
    private Array<E> array;

    public ArrayQueue(int capacity) {
        array = new Array<E>(capacity);
    }

    public ArrayQueue() {
        array = new Array<E>();
    }

    @Override
    public int getSize() {
        return array.getSize();
    }

    @Override
    public boolean isEmpty() {
        return array.isEmpty();
    }

    @Override
    public void enqueue(Object e) {
        array.addLast((E) e);
    }

    public int getCapacity() {
        return array.getCapacity();
    }


    @Override
    public E dequeue() {
        return array.removeFirst();
    }

    @Override
    public Object getFront() {
        return array.getFast();
    }

    @Override
    public String toString() {
        StringBuilder res = new StringBuilder();
        res.append("Queue: ");
        res.append("front [");
        for (int i = 0; i < array.getSize(); i++) {
            res.append(array.get(i));
            if (i != array.getSize() - 1)
                res.append(", ");
        }
        res.append("] tail");
        return res.toString();
    }

    public static void main(String[] args) {
        ArrayQueue<Integer> queue = new ArrayQueue<Integer>();
        for (int i=0;i<10;i++){
            queue.enqueue(i);
            System.out.println(queue);
            if (i%3==2)
                queue.dequeue();
                System.out.println(queue);
        }
    }
}
public interface Queue<E> {
    int getSize();
    boolean isEmpty();
    void enqueue(E e);
    E dequeue();
    E getFront();
}

控制台输出

这样我们就完成了一个简单的队列!

数组队列复杂度分析

算法数据与结构——栈和队列插图12

发表评论 取消回复
表情 图片 链接 代码

分享