版权声明:转载请注明原文地址。 https://blog.csdn.net/qq_39240270/article/details/86765941
什么是栈
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。 --百度百科.
数据结构中的栈长这个样子:
栈其实非常的好理解,我们可以将栈看成一个箱子
- 往箱子里放东西叫做入栈
- 从箱子里取东西叫做出栈
- 箱子的底部叫做栈底
- 箱子的顶部叫做栈顶
栈的特性
关于栈的特性,有一句特别经典的言语来概括:先进先出(LIFO,Last In First Out)
- 往箱子里放书,想要拿出箱子底部的书,得把箱子顶部的书先拿走才行。
栈的实现
下面是用数组实现栈(静态栈):
public class ArrayStack {
private int size;//容量
private long a[];
private int top;//栈顶
public ArrayStack(int maxSize) {
this.size = maxSize; //定义栈的最大容量
this.a = new long[maxSize];//初始化栈
this.top = -1;//初始化栈顶,表示空栈
}
//入栈
public void push(int value) {
if(isFull()) {
System.out.println("栈已满!");
return;
}
a[++top] = value;
}
//查看栈顶元素,不删除
public long peek() {
if(isEmpty()) {
System.out.println("栈为空!");
return -1;
}
return a[top];
}
//弹出栈顶元素,删除,并返回栈顶元素
public long pop() {
if(isEmpty()) {
System.out.println("栈为空!");
return -1;
}
return a[top--];
}
//遍历栈,从栈顶开始遍历
public void traverseStack() {
for(int i = top;i >= 0;i--) {
System.out.println(a[i]);
}
}
//判断栈是否已满
public boolean isFull() {
return size == top + 1;
}
//判断栈是否为空
public boolean isEmpty() {
return top == -1;
}
}
下面使用链表实现(动态栈),因为此时栈的大小可以改变:
//节点类
class Node {
//为方便数据查看,用public声明
//数据域
public int data;
//指向下一个节点
public Node next;
public Node(int data) {
this.data = data;
}
}
public class LinkedStack {
//栈顶指针
private Node stackTop;
//栈顶指针
private Node stackBottom;
//栈的大小,方便测试,声明为public
public int size;
public LinkedStack() {}
//初始化栈
public LinkedStack(Node stackTop,Node stackBottom) {
this.stackTop = stackTop;
this.stackBottom = stackBottom;
this.size = 0;
}
//入栈
public void push(int data) {
//创建节点
Node node = new Node(data);
//将栈顶本来指向的节点交给该新节点
node.next = this.stackTop;
//将该节点设为栈顶
this.stackTop = node;
//栈的大小加一
size ++;
}
//查看栈顶数值
public int peek() {
//判断栈是否为空
if(isEmpty()) {
System.out.println("栈为空!");
return -1;
}
return this.stackTop.data;
}
//弹出栈顶元素,并删除,返回栈顶数值
public int pop() {
//判断栈是否为空
if(isEmpty()) {
System.out.println("栈为空!");
return -1;
}
int i = this.stackTop.data;
this.stackTop = this.stackTop.next;
size --;
return i;
}
//遍历栈,从栈顶开始
public void traverseStack() {
//创建一个新节点用于遍历栈
Node currentNode = stackTop;
while( currentNode != null) {
System.out.println(currentNode.data);
currentNode = currentNode.next;
}
}
//查看栈中值的数目
public int size() {
return size;
}
//清空栈
public void clear() {
//使栈顶元素指向栈底即可清空栈
this.stackTop = this.stackBottom;
}
//判断栈是否为空
public boolean isEmpty() {
return size == 0;
}
}