众所周知,栈是在编程中很常用的一种数据结构,栈的特点是后进先出,本文整理了Java中堆栈实现的几种方法。
栈中主要的方法:
Push:入栈操作,将数据加到栈顶;
Pop:出栈操作,返回栈顶数据;
GitSize:返回栈规模;
empty:判断栈是否为空
1.用数组实现栈(顺序栈):
用数组实现栈的方法十分简单,代码如下:
public class Stack_Array {
private int[] array = new int[10];
private int longest = 10;
private int size = 0;//用于存储栈规模以及栈顶位置
public void Push(int a) {//入栈
if(size<longest) {
array[size] = a;
size++;
}
else {
System.out.println("栈已满。");
}
}
public int Pop() {//出栈
if(size>0) {
size--;
return array[size];
}
else {
System.out.println("栈为空");
return 0;
}
}
int GetSize() {//获取栈规模
return size;
}
public boolean empt(){ //判断栈是否为空
return size == 0;
}
}
但是,显而易见的是,上面这种方法实现的栈总规模有限,在存储较多数据时会有栈空间不够用的情况,一次分配较多空间的话,又会造成大量空间的浪费。所以我们对其进行适当的改进,使其可以自适应地调整数组大小,以此来保证能存下较多数据的同时对存储空间有较好的利用。改进后的代码如下:
public class Stack_Array {
private int[] array = new int[10];
private int longest = 10;
private int size = 0;
public void Push(int a) {//入栈
if(size<longest) {
array[size] = a;
size++;
}
else {//如果栈满就将栈容量扩大为原来的2倍
int[] temp = array;
longest *= 2;
array = new int[longest];
System.arraycopy(temp, 0, array, 0, temp.length);
array[size] = a;
size++;
}
}
public int Pop() {//出栈
if(size>0&&size>=longest/3&&size>100) {//如果栈容量大于100且使用的栈空间小于1/3
int[] temp = array; //则将栈容量缩小为原来的1/2
longest /= 2;
array = new int[longest];
System.arraycopy(temp, 0, array, 0, temp.length);
size--;
return array[size];
}
else if(size == 0){
System.out.println("栈为空");
return 0;
}
else {
size--;
return array[size];
}
}
public int GetSize() {//获取栈规模
return size;
}
public boolean empty() {//判断栈是否为空
return size == 0;
}
}
2.使用链表实现栈(链栈):
与顺序栈比起来,使用链表来存储数据使得内存开销大大减小,需要多少内存就分配多少内存,不使用就将内存返还给系统,有很多优点。下面是链栈的实现:
首先创建结点类:
public class Node <elemType>{
elemType data;//存储数据
@SuppressWarnings("rawtypes")
Node next;//指向下一个结点
//构造方法
Node(){}
Node(elemType data){
this.data = data;
}
Node(elemType data, Node<elemType> e){
this.data = data;
this.next = e;
}
}
链栈实现:
public class Stack<elemType> {
private int size = 0;
Node<elemType> top = new Node<>(null);//栈顶
//构造方法
Stack(){}
Stack(Node<elemType> e){
top.data = e.data;
top.next = e.next;
}
Stack(elemType data){
top.data = data;
top.next = null;
}
Stack(elemType data,Node<elemType> next){
top.data = data;
top.next = next;
}
public void Push(elemType data) {//入栈
Node<elemType> oldTop = top;
top = new Node<elemType>();
top.data = data;
top.next = oldTop;
oldTop = null;
size++;
}
@SuppressWarnings("unchecked")
public elemType Pop() {//出栈
if(size != 0) {
elemType data;
data = top.data;
top = top.next;
size--;
return data;
}
else {
return null;
}
}
public int getSize() {//获取栈规模
return size;
}
public boolean empty() {//判断栈是否为空
return size == 0;
}
}