栈
一、什么是栈?
栈首先是一个特殊的线性表,其特殊之处在于,对于数据的插入和删除都在表的一端进行,把固定的进行数据插入、删除的一端叫做栈顶,另一端叫做栈底,栈中的元素应该遵循后进先出的原则。
压栈:对栈进行插入数据
出栈:对栈进行删除数据
二、栈的基本操作
push():入栈;
pop ():出栈;
peek():取栈顶元素;
使用栈时;首先要引用以下Java包
import java.util.Stack;
创建栈
Stack<String> a = new Stack<>();//泛型中填写相应的包装类
三、对于栈的实现
(1)使用顺序表实现
public class MyStack {
private int[] data = new int[100];
private int size = 0;
//入栈
public void push(int val){
if(size == data.length){
//这里也可以进行扩容
return;
}
data[size] = val;
size++;
}
//出栈
public Integer pop(){
if (size == 0){
return null;
}
//栈顶元素就是最后一个元素
int ret = data[size-1];
//删除元素
size--;
return ret;
}
//取栈顶元素
public Integer peek(){
if (size == 0){
return null;
}
return data[size-1];
}
}
(2)使用链表实现
class Node{
int val;
Node next;
public Node(int val){
this.val = val;
}
}
public class MyStack {
//使用不带傀儡结点的链表
//如果使用带傀儡结点的链表更方便
private Node head = null;
//1.入栈
public void push(int val){
Node newNode = new Node(val);
//使用头插
//由于是不带傀儡结点的链表,所以需要判断头结点是空还是非空
if (head == null){
head = newNode;
return;
}
newNode.next = head;
head = newNode;
}
//2.出栈
public Integer pop(){
if (head == null){
return null;
}
if (head.next == null){
int ret = head.val;
head = null;
return ret;
}
int ret = head.val;
head = head.next;
return ret;
}
//3.取栈顶元素
public Integer peek(){
if(head == null){
return null;
}
return head.val;
}
}
四、栈的应用
括号的匹配、小型计算器的实现