栈
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。
基于顺序表实现
package src.bit0414.Test;
/**
* @ Created with IntelliJ IDEA.
* @ClassName MyStack
* @Description
* @Author by
* @Date 2020/4/26 18:25
*/
public class MyStack {
// 栈可以基于顺序表实现, 也可以基于链表实现.
private int[] array = new int[100];
// array 中 [0, size) 区间中的元素是栈中的有效元素
// 0 号元素相当于栈底; size - 1 位置的元素相当于栈顶
private int size = 0;
//进栈操作
public void push(int value) {
// 把 value 放到数组末尾. 此处没有考虑扩容的问题.
array[size] = value;
size++;
}
//出栈
public Integer pop() {
if (size <= 0) {
// 此处的失败可以有两种表示方式.
// 可以返回非法值, 也可以抛出异常.
return null;
}
int ret = array[size - 1];
size--;
return ret;
}
public Integer peek() {
if (size <= 0) {
return null;
}
int ret = array[size - 1];
return ret;
}
public static void main(String[] args) {
MyStack myStack = new MyStack();
myStack.push(1);
myStack.push(2);
myStack.push(3);
myStack.push(4);
while (true) {
Integer cur = myStack.pop();
if (cur == null) {
break;
}
System.out.println(cur);
}
}
}
基于链表的实现
package src.bit0414.Test;
/**
* @ Created with IntelliJ IDEA.
* @ClassName MyStack2
* @Description
* @Author by
* @Date 2020/4/26 21:02
*/
public class MyStack2 {
static class Node {
public int val;
public Node next;
public Node(int val) {
this.val = val;
}
}
// 使用链表也能实现栈. 用链表头部表示栈顶, 链表尾部表示栈底.
// 只要知道头结点, 就能获取到后面的所有节点.
// 一般表示链表. 都是使用一个头结点应用来表示整个链表.
// 此处相当于是 "用局部表示整体" 这种修辞手法叫做 "借代"
// 链表有八种链表.
// 1. 不带环的 vs 带环的
// 2. 单向的 vs 双向的
// 3. 带傀儡节点的 vs 不带傀儡节点的.
// 此处为了方便, 写一个带傀儡节点的链表
Node head = new Node(-1);
public void push(int value) {
//头插
Node newHead = new Node(value);
newHead.next = head.next;
head.next = newHead;
}
public Integer pop() {
//头删
if(head.next==null) {
return null;
}
int cur = head.next.val;
head.next = head.next.next;
return cur;
}
public Integer peek() {
if(head.next==null) {
return null;
}
return head.next.val;
}
}