栈及其模拟实现
栈的说明
栈也是一种线性表,对应的集合类是Stack,它和ArrayList底层都是数组实现的,不过这俩不一样,栈这种数据结构遵循后进先出原则(Last In First Out ),
栈的插入删除操作只能在栈顶完成,
插入操作叫入栈或压栈(push),删除操作叫出栈(pop)。
- 由于栈的这种特性,所以栈的方法也比较少,比较简单
栈的模拟实现
package demo1;
import java.util.Arrays;
public class MyStack {
int[] elem;
int usedSize;
public MyStack(){
elem = new int[5];
}
//判断栈是否满
private boolean isFull(){
return usedSize == elem.length;
}
//压栈
public int push(int val){
if(isFull()){
elem = Arrays.copyOf(elem,2*elem.length);
}
elem[usedSize++] = val;
return val;
}
//判断栈是否空
public boolean isEmpty(){
return usedSize == 0;
}
//出栈
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈为空,无法出栈!!!");
}
int ret = elem[usedSize-1];
usedSize--;
return ret;
}
//返回栈顶元素
public int peek(){
if(isEmpty()){
throw new RuntimeException("栈为空!!!");
}
return elem[usedSize-1];
}
//返回栈中元素个数
public int size(){
return usedSize;
}
}
栈的应用场景
逆序打印链表,将递归转化为循环
public void display2(ListNode head){
if (head==null){
return;
}
display2(head.next);
System.out.println(head.val);
}
- 这是递归方式逆序打印链表
public void display3(){
Stack<ListNode> stack = new Stack<>();
ListNode curNode = head;
while(curNode!=null){
stack.push(curNode);
curNode = curNode.next;
}
while (!stack.empty()){
ListNode ret = stack.pop();
System.out.print(ret.val+" ");
}
}
- 通过栈逆序打印链表