先进后出的一种数据结构。
特殊的数组或者链表,线性表。
存在限制条件,只能操作栈顶。
一:有趣的题目
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; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)