基本介绍
- 栈是一个先入后出的有序列表。
- 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一段,称为栈顶,另一端为固定的一端,称为栈底。
- 根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
- 图解
应用场景
- 子程序的调用:在跳往子程序前,会先将下个指令的内存地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。
- 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。
- 表达式的转换【中缀表达式转后缀表达式】与求值。
- 二叉树的遍历。
- 图的深度优先搜索法。
使用链表实现栈
- 节点类
package com.stack;
public class Node {
private Object data;
private Node next;
public Node() {
}
public Node(Object data) {
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
@Override
public String toString() {
return "Node{" +
"data=" + data +
'}';
}
}
- 栈的实现类
package com.stack;
public class LinkedListStack {
private Node head = new Node();
private int maxSize;
public LinkedListStack(int maxSize) {
this.maxSize = maxSize;
}
public boolean isFull(){
Node temp = head.getNext();
int total = 0;
while(temp != null){
total++;
temp = temp.getNext();
}
return total == maxSize;
}
public boolean isEmpty(){
return head.getNext() == null;
}
public void push(Node node){
if(isFull()){
throw new RuntimeException("栈满!");
}
Node temp = head;
Node cur = head;
//避免重复数据入栈
while(true){
if(cur.getNext() == null){
break;
}
if(cur.getNext() == node){
throw new RuntimeException("数据重复入栈!");
}
cur = cur.getNext();
}
node.setNext(temp.getNext());
temp.setNext(node);
}
public void pop(){
if(isEmpty()){
throw new RuntimeException("栈空!");
}
Node temp = head;
temp.setNext(temp.getNext().getNext());
}
public void list(){
if(head.getNext() == null){
System.out.println("栈空!");
return;
}
Node temp = head.getNext();
while(temp != null){
System.out.println(temp);
temp = temp.getNext();
}
}
}