随笔- 100  文章- 0  评论- 3  阅读- 30413 

  先进后出的一种数据结构。

  特殊的数组或者链表,线性表。

  存在限制条件,只能操作栈顶。

 

一:有趣的题目

1.设计一个括号匹配的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.jun.algorithm.foundation.main;
 
import java.util.Objects;
 
/**
 * 括号问题
 * <p>
 * 右括号来了,就找栈顶看是否可以匹配,匹配就出栈
 * 最后栈应该是空
 *
 * @author caojun
 */
public class Bracket {
    public static boolean isOk(String str) {
        StackImpl<Character> brackets = new StackImpl<>(20);
        char[] chars = str.toCharArray();
 
        for (Character c : chars) {
            switch (c) {
                case '{':
                case '(':
                case '[':
                    brackets.push(c);
                    break;
                case '}':
                    if (Objects.equals('{', brackets.pop())) {
                        break;
                    } else {
                        return false;
                    }
                case ']':
                    if (Objects.equals('[', brackets.pop())) {
                        break;
                    } else {
                        return false;
                    }
                case ')':
                    if (Objects.equals('(', brackets.pop())) {
                        break;
                    } else {
                        return false;
                    }
            }
        }
        return brackets.isEmpty();
    }
}

  

 

 

二:栈

1.具体的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.jun.algorithm.foundation.main;
 
/**
 * 栈的接口
 *
 * @param <Item>
 * @author caojun
 */
public interface IStack<Item> {
 
    void push(Item item);
 
    Item pop();
 
    int size();
 
    boolean isEmpty();
}

  

  具体是数组方式实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package com.jun.algorithm.foundation.main;
 
/**
 * 栈的实现
 * 通过数组实现
 *
 * @author caojun
 */
public class StackImpl<Item> implements IStack<Item> {
 
    private Item[] a = (Item[]) new Object[1];
    private int n = 0;
 
    public StackImpl() {
 
    }
 
    public StackImpl(int cap) {
        a = (Item[]) new Object[cap];
    }
 
    @Override
    public void push(Item item) {
        judgeSize();
        a[n++] = item;
    }
 
    @Override
    public Item pop() {
        if (isEmpty()) {
            return null;
        }
        Item item = a[--n];
        a[n] = null;
        return item;
    }
 
    @Override
    public int size() {
        return 0;
    }
 
    @Override
    public boolean isEmpty() {
        return false;
    }
 
    private void judgeSize() {
        // 扩展
        if (a.length < n) {
            reSize(2 * a.length);
        }
        if (n > 0 && n < a.length / 2) {
            reSize(a.length / 2);
        }
    }
 
    private void reSize(int size) {
        Item[] temp = (Item[]) new Object[size];
        for (int i = 0; i < n; i++) {
            temp[i] = a[i];
        }
        a = temp;
    }
}

  

 posted on   曹军  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示