1.入栈出栈取栈顶元素的操作
package com.jiaxinli.stack;
import java.util.Arrays;
public class MyStack {
private int [] elementData;
// 有效元素的个数
private int size;
// 定义一个数组默认的大小
private final int DEFAULT_CAPACITY = 3;
public MyStack() {
this.elementData = new int[DEFAULT_CAPACITY];
}//分配数组容量
public MyStack(int capacity) {
if (capacity < 0) {
throw new RuntimeException("数组容量不能小于0.");
} else if (capacity > 0) {
this.elementData = new int[capacity];
} else {
this.elementData = new int[DEFAULT_CAPACITY];
}
}
//入栈
public void push(int data) {
// 数组是否需要扩容
ensureCapacity();
// 在size位置加入元素
elementData[size] = data;
// size++
size++;
}
//出栈
public int pop () {
//出栈顶元素
int top = peek();
// 把size - 1
size--;
return top;
}
public int peek() {
if (size == 0) {
// 栈为空
throw new RuntimeException("栈为空");
}
// 获取栈顶的元素,返回
int top = elementData[size - 1];
return top;
}
private void ensureCapacity() {
if (size == elementData.length) {
this.elementData = Arrays.copyOf(elementData, elementData.length * 2);
}
}
public int size() {
return size;
}
public boolean empty () {
return size == 0;
}
}
2栈的应用(有效的括号oj题)
package com.jiaxinli.stack;
import java.util.Stack;
//括号匹配(有效的括号)
public class Exe_Stack {
public boolean isValid(String s) {
if (s == null || s.equals("")) {
return false;
}
// 1.定义一个栈用来存入左括号
Stack<Character> stack = new Stack<>();
// 2.开始遍历字符串
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
// 判断是否左括号
if (ch == '(' || ch == '[' || ch == '{') {
// 入栈
stack.push(ch);
} else {
// 先检查一下栈是否为空,如果为空就直接返回false
if(stack.isEmpty()) {
return false;
}
// 获取栈顶元素与当前右括号进行匹配校验
char top = stack.peek();
if (top == '(' && ch == ')' || top == '[' && ch == ']' || top == '{' && ch == '}') {
// 出栈
stack.pop();
} else {
return false;
}
}
}
// 检查一下栈是否为空
if (!stack.isEmpty()) {
return false;
}
// 最后返回true
return true;
}
}
3 ArrayList和LinkedList的区别(非常重要)
ArrayList
存储空间: 物理上一定连续
随机访问 :支持 复杂度O(1)
头插: 需要搬移元素,效率低O(N)
插入元素: 空间不够时需要扩容
应用场景: 元素高效存储需要频繁访问
LinkedList
存储空间:逻辑上连续,但物理上不一定连续
随机访问:不支持 复杂度O(n)
头插:修改引用的指向 时间复杂度O(1)
插入元素:只修改引用的指向,且没有容量的概念
应用场景:可以在任意位置插入删除