数组
注意:其实堆栈本身就是栈,只是换了个抽象的名字。
public class StackByArray {
private int[] arr;
private int top;
public StackByArray(int size){
arr=new int[size];
top=-1;
}
//判断堆栈是否为空
public boolean isEmpty(){
if(top==-1){
return true;
}else{
return false;
}
}
//将指定数据压入堆栈
public void push(int data) {
//方式1:不扩容
/*if(top>=arr.length){
System.out.println("堆栈已满,无法再压入");
return false;
}else{
arr[++top]=data;
return true;
}*/
//方式2:扩容
if (top >= arr.length) {
this.arr = Arrays.copyOf(this.arr, 2 * arr.length);
} else {
arr[++top] = data;
}
}
//从堆栈弹出数据
public int pop(){
if(isEmpty()){
return -1;
}else{
return arr[top--];
}
}
}
链表
先创建一个结点类
public class Node {
int data;
Node next;
public Node(){}
public Node(int data){
this.data=data;
next=null;
}
}
在创建链表实现堆栈的类
public class StackByLink {
Node front;
Node rear;
//判断是否为空
public boolean isEmpty(){
return front==null;
}
//将指定数据压入栈顶
public void push(int data){
Node newNode=new Node(data);
if(isEmpty()){
front=newNode;
rear=newNode;
}else{
rear.next=newNode;
rear=newNode;
}
}
//从栈顶中弹出数据
public void pop(){
if(isEmpty()){
System.out.println("当前堆栈为空,无法弹出数据");
return;
}else if(front==rear){
front=null;
rear=null;
} else{
Node ptr=front;
while(ptr.next!=rear)
ptr=ptr.next;
ptr.next=rear.next;
rear=ptr;
}
}
//遍历堆栈
public void ergodic(){
System.out.println("****************************");
Node cur=front;
while(cur!=null){
System.out.print(cur.data+" ");
cur=cur.next;
}
System.out.println();
}
}