目录
前言
大家好,这篇博客带大家了解一下栈是什么? 并且用两种方式为大家实现一下栈
一、栈是什么?
栈是一种数据结构,它遵循"后进先出"(Last In First Out,LIFO)的原则。栈可以看作是一种特殊的线性表,只能在表的一端进行插入和删除操作,这一端被称为栈顶。栈的另一端被称为栈底。
栈中的方法: 栈的基本操作包括入栈(push)和出栈(pop)。入栈将元素放入栈顶,出栈将栈顶元素移除。栈还可以支持其他操作,如获取栈顶元素(top)和判断栈是否为空(empty)。
栈的应用场景 :
1.子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
2. 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
3.表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)
4.二叉树的遍历。
5.图形的深度优先(depth一first)搜索法。
二、栈的实现
栈的实现有两种方式: 1.数组模拟实现 2.链表模拟实现
1.数组模拟实现栈
设计思想:
1. 模拟实现栈的数组
2. 数组的容量capacity
3. 指向栈顶的指针
框架代码
public class Stack { private int capacity; private int top = -1; // 刚开始栈中没有元素,设置初始值为-1 private int[] stack = new int[capacity]; public Stack(int capacity) { this.capacity = capacity; } // 判断栈是否空的方法 public Boolean IsEmpty(){ return top == -1; } // 判断是否栈满方法 public Boolean IsFull(){ return top == capacity - 1; } }
方法实现:
参考[Java参考文档].JDK_API_1_6_zh_CN (1).CHM
Peek(): 偷窥栈顶元素
public int Peek(){ if(IsEmpty()){ throw new RuntimeException("栈空!"); } return stack[top]; }
pop(): 栈顶出栈
public int pop(){ // 判断栈是否为空 if(IsEmpty()){ throw new RuntimeException("栈空,无法出栈!"); } int topVal = stack[top]; top--; return topVal; }
出栈时直接将栈顶元素记录下来,再将top-- 即可,不需要修改top-- 之前stack[top]的值
push():
public void push(int val){ if(IsFull()){ throw new StackFullException("栈满!"); // 自定义异常类,来表示栈满 } stack[++top] = val; }
自定义异常忘了没? JAVA中的深情哥-Exception(异常)-上_喜欢吃animal milk的博客-CSDN博客
2.链表模拟实现
由于链表实现和数组实现差别不是天大,这里直接给出代码
public class ListStack {
LikedList head = new LikedList(-1);
public void push(int no){
LikedList node = new LikedList(no);
LikedList cur = head;
while(cur.next != null){
cur = cur.next;
}
cur.next = node;
}
public int pop(){
LikedList cur = head;
if(cur.next == null){
throw new StackEmptyException("栈空");
}
while(cur.next.next != null){
cur = cur.next;
}
int value = cur.next.no;
cur.next = null;
return value;
}
}
// 节点类,定义为外部类
class LikedList{
int no;
LikedList next;
public LikedList(int no){
this.no = no;
}
}
3 . 栈的继承体系
总结
本文到此结束,总的来说是很简单的,下篇博客会给大家将栈的综合应用