Java算法之栈和队列

基本概念

栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往上堆。取走时,只能从上面一件一件取。读和取都在顶部进行,底部一般是不动的。栈就是一种类似堆积物品的数据结构,进行删除和插入的一端称栈顶,另一端称栈底。插入一般称为进栈,删除则称为退栈。 栈也称为后进先出表。

代码

public class MyStack {
    //底层实现是一个数组
    private long[] arr;
    // 数组下标
    private int top;

    /**
     * 默认构造方法
     */
    public MyStack() {
        arr = new long[10];
        top = -1;
    }

    /**
     * 带参数的构造方法
     *
     * @param maxSize 数组的初始化长度
     */
    public MyStack(int maxSize) {
        arr = new long[maxSize];
        top = -1;
    }

    /**
     * 添加数据(压栈)
     *
     * @param value 添加的数值
     */
    public void push(int value) {
        // ++top后top由-1变为了0,即第一个值添加到arr[0]的位置
        arr[++top] = value;
    }

    /**
     * 移除数据
     *
     * @return
     */
    public long pop() {
        return arr[top--];
    }

    /**
     * 查看栈顶数据
     *
     * @return
     */
    public long peek() {
        return arr[top];
    }

    /**
     * 判断是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 判断是否满了
     *
     * @return
     */
    public boolean isFull() {
        return top == arr.length - 1;
    }
}

测试

public class TestMyStack {
    public static void main(String[] args) {
        MyStack ms = new MyStack(4);
        ms.push(0);
        ms.push(1);
        ms.push(2);
        ms.push(3);
        System.out.println(ms.isEmpty());
        System.out.println(ms.isFull());
        System.out.println(ms.peek());
        while (!ms.isEmpty()){
            System.out.print(ms.pop()+" ");
        }
        System.out.println();
        System.out.println(ms.isEmpty());
        System.out.println(ms.isFull());
    }
}

结果

false
true
3
3 2 1 0 
true
false

从结果中可以看到,往栈中压入数据的顺序(0,1,2,3)和弹出数据的顺序(3,2,1,0)刚好相反。

队列

基本概念

队列的操作是在两端进行的,其中一端只能进行插入,该端称为队列的队尾,而另一端只能进行删除,该端称为队列的队首。
队列在我们日常生活中经常碰到,例如,排队买东西,谁先来,谁先买,买完就走,谁后来,谁在队的最后面排队。队列的运算规则是FIFO(first in first out),或者叫做先进先出

代码

public class MyQueue {
    //底层实现是一个数组
    private long[] arr;
    //有效数据大小
    private int elements;
    //队头
    private int front;
    //队尾
    private int end;

    /**
     * 默认的无参构造
     */
    public MyQueue() {
        arr = new long[10];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 带参数的构造方法
     *
     * @param maxSize
     */
    public MyQueue(int maxSize) {
        arr = new long[maxSize];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 从队尾插入数据
     *
     * @param value
     */
    public void insert(long value) {
        if (end == arr.length - 1) {
            end = -1;
        }
        //每次都从队尾插入数据
        arr[++end] = value;
        elements++;
    }

    /**
     * 从队头删除数据
     *
     * @return
     */
    public long remove() {
        long value = arr[front++];
        if (front == arr.length) {
            front = 0;
        }
        elements--;
        return value;
    }

    /**
     * 从队头查看数据
     *
     * @return
     */
    public long peek() {
        return arr[front];
    }

    /**
     * 判断队列是否为空
     *
     * @return
     */
    public boolean isEmpty() {
        return elements == 0;
    }

    /**
     * 判断队列是否满了
     *
     * @return
     */
    public boolean isFull() {
        return elements == arr.length;
    }
}

测试

public class TestMyqueue {
    public static void main(String[] args) {
        MyQueue mq = new MyQueue(4);
        mq.insert(0);
        mq.insert(1);
        mq.insert(2);
        mq.insert(3);
        System.out.println(mq.isEmpty());
        System.out.println(mq.isFull());
        System.out.println(mq.peek());
        while (!mq.isEmpty()){
            System.out.print(mq.remove()+" ");
        }
        System.out.println();
        System.out.println(mq.isEmpty());
        System.out.println(mq.isFull());
    }
}

结果

false
true
0
0 1 2 3 
true
false

从结果中可以看到,往队列中添加数据的顺序(0,1,2,3)和移除数据的顺序(0,1,2,3)相同。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容