目录
栈
特点: 先进后出的形式组织数据结构.
羽毛球最先放到里面的球最后拿出来用
栈的实现
栈的方法如下图:
用数组实现栈
初始化
使用数组设置一个容量
private int[] elem;
private int usedSize;
private static final int DEAFAULT_CAPACITY = 10;
public MyStack() {
this.elem = new int[DEAFAULT_CAPACITY];
}
入栈
注意栈是否满了
@Override
public void push(int x) {
if(isFull()) {
elem = Arrays.copyOf(elem, 2*elem.length);
}
elem[usedSize] = x;
usedSize++;
}
出栈
注意栈是否为空
@Override
public int pop() {
if(empty()) {
try {
throw new EmptyException("栈空了");
} catch (EmptyException e) {
e.printStackTrace();
}
}
int old = elem[usedSize-1];
usedSize--;
//如果是引用类型, 需要将该位置置为空
return old;
}
取栈顶元素
看栈是否为空
@Override
public int peek() {
if(empty()) {
try {
throw new EmptyException("栈空了");
} catch (EmptyException e) {
e.printStackTrace();
}
}
return elem[usedSize];
}
判断栈大小
@Override
public int size() {
return usedSize;
}
判断栈是否为空
@Override
public boolean empty() {
return usedSize == 0;
}
判断栈是否为满
@Override
public boolean isFull() {
return usedSize == elem.length;
}
用链表实现栈
使用单向链表实现的逻辑:
从头入 O(1) 从头出 O(1)
从尾巴入 O(n) 从尾巴出 O(n)
代码实现:
package stackdemo;
public interface IList {
void push(int x);
int pop();
int peek();
boolean isEmpty();
int size();
}
package stackdemo;
public class MStack implements IList {
static class ListNode {
public int val;
public ListNode next;
public ListNode(int x) {
this.val = x;
}
}
public ListNode head;
int usedSize = 0;
@Override
public void push(int x) {
ListNode listNode = new ListNode(x);
if(head == null) {
head = listNode;
}else {
listNode.next = head;
head = listNode;
}
usedSize++;
}
@Override
public int pop() {
if(isEmpty()) {
return -1;
}
int old = head.val;
head = head.next;
return old;
}
@Override
public int peek() {
if(isEmpty()) {
return -1;
}
return head.val;
}
@Override
public boolean isEmpty() {
return usedSize == 0;
}
@Override
public int size() {
return usedSize;
}
}
小结
栈 虚拟机栈 栈帧 有什么区别?
栈: 一种数据结构
虚拟机栈: JVM 划分的一块内存
栈帧: 调用方法的时候会在虚拟机中给这个方法开辟一块内存