✨这里是第七人格的博客,小七欢迎您的到来~✨
系列专栏:【数据结构和算法】
✈️本篇内容: 栈✈️
本篇收录完整代码地址:数据结构和算法-Java实现
栈(Stack)又名堆栈,它是一种基于先进后出(FILO-First In Last Out)且运算受限的线性表。说人话就是,栈是一种特殊的链表或者数组,就像咱们叠碗一样,放的时候是一个一个往下放,拿的时候是从上往下一个个拿,也就是说我们仅仅只能操作表尾的数据。如图所示:
栈的特点就是先进后出。谈到线性结构,我们第一时间应该就会想到数组和链表,栈根据底层的实现不同,也分为基于数组的栈和基于链表的栈,下文将会介绍数组栈。
基于数组的栈——以数组为底层数据结构时,通常以数组头为栈底,数组头到数组尾为栈顶。
public class ArrayStack01 {
/**
* 数据
*/
private int[] data;
/**
* 大小 初始的元素个数为0
*/
private int n = 0;
}
大小为0,则表示栈为空
/**
* 是空
*
* @return boolean
*/
public boolean isEmpty() {
return n == 0;
}
/**
* 入栈
*
* @param item 项
* @return {@link ArrayStack01}
*/
public ArrayStack01 push(int item) {
data[n++] = item;
return this;
}
/**
* 出栈
*
* @return int
*/
public void pop() {
if(isEmpty()){
return;
}
// 数据大小减少1
--n;
// 将栈顶置为0
data[n] = 0;
}
此题来源leetcode
20. 有效的括号
class Solution {
public static boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
public static void main(String[] args) {
boolean valid = isValid("{[]}");
System.out.println(valid);
}
}