一、栈
在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构。如同我们往箱子里放东西,先放进去的在最底下,后放进去的在上面,拿东西的时候肯定先拿上面的,之后才能拿下面的。栈其实就是一个后进先出的线性表。
假设给定栈 S=(a0,a1,…,an-1),则称 a0 为栈底,an-1 为栈顶。进栈则按照 a0,a1,…,an-1 的顺序进行进栈;而出栈的顺序则需要反过来,按照“后存放的先取,先存放的后取”的原则进行,则 an-1 先退出栈,然后 an-2 才能够退出,最后再退出 a0。在实际编程中,可以通过两种方式来实现:使用数组的形式来实现栈,这种栈也称为静态栈;使用链表的形式来实现栈,这种栈也称为动态栈。
二、栈的代码实现
1.静态栈
根据顺序存储结构来写的,底层是由数组来实现。所以不需要定义节点。
public class SqStack {
Object[] stack; //对象数组,静态栈是用数组来实现的
final int defaultSize = 10; //默认长度
int top; //栈顶位置(的一个下标)
int maxSize; //最大长度
//无参构造方法:默认长度
public SqStack() {
init(defaultSize);
}
//带参构造方法:最大长度
public SqStack(int size) {
init(size);
}
public void init(int size) {
this.maxSize = size;
top = 0;
stack = new Object[size];
}
//获取栈顶元素
public Object getTop() throws Exception {
if (isEmpty()) {
throw new Exception("栈为空!");
}
return stack[top - 1];
}
//判断栈是否为空
public boolean isEmpty() {
return top == 0;
}
//入栈操作
public void push(Object obj) throws Exception {
//首先判断栈是否已满
if (top == maxSize) {
throw new Exception("栈已满!");
}
stack[top] = obj;
top++;
}
//出栈操作
public Object pop() throws Exception {
if (isEmpty()) {
throw new Exception("栈空!");
}
top--;
return stack[top];
}
}
2.动态栈
动态栈(链式栈)就需要定义节点了,因为链式栈的每一个节点要存的信息比较多,比如当前节点的数据值,还有下一个节点的地址。
首先,定义一个节点对象:
public class Node {
Object element; //数据
Node nextNode; //下一个节点的指针
//头结点的构造方法
public Node(Node nextNode) {
this.nextNode = nextNode;
}
//非头结点的构造方法
public Node(Object obj, Node nextNode) {
this.element = obj;
this.nextNode = nextNode;
}
public Object getElement() {
return element;
}
public void setElement(Object element) {
this.element = element;
}
public Node getNextNode() {
return nextNode;
}
}
然后,定义栈的主体:
public class LinkStack {
Node head; //栈顶指针
int size; //结点的个数
public LinkStack() {
head = null;
size = 0;
}
//取得栈顶元素
public Object getTop() throws Exception {
return head.getElement();
}
//判断栈是否为空
public boolean isEmpty() {
return head == null;
}
//入栈
public void push(Object obj) throws Exception {
head = new Node(obj, head);
size++;//大小增加一个
}
//出栈
public Object pop() throws Exception {
if (isEmpty()) {
throw new Exception("栈为空!");
}
Object obj = head.getElement();
head = head.getNextNode();//将栈顶指针指向下一个
size--;//大小减小一个
return obj;
}
}