栈
定义:
栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈
栈的java代码实现:
基于数组:
1 import org.junit.jupiter.api.Test; 2 3 /** 4 * 用数组实现栈 5 * @author wydream 6 * 7 */ 8 9 public class ArrayStack<T> { 10 11 private T data[]; 12 private int maxSize; 13 private int top; 14 15 16 //初始化栈 17 public ArrayStack(int maxSize) { 18 this.maxSize=maxSize; 19 data=(T[])new Object[maxSize]; 20 this.top=-1; 21 } 22 23 //判断栈是否为空 24 public boolean isEmpty() { 25 return (top==-1); 26 } 27 28 //判断栈是否已经满了 29 public boolean isFull() { 30 return (top==maxSize-1); 31 } 32 33 34 //压栈 35 public boolean push(T value) { 36 if(isFull()) { 37 return false; 38 } 39 top++; 40 data[top]=value; 41 return true; 42 } 43 44 45 //取出栈顶元素 46 public T pop() { 47 if(isEmpty()) { 48 return null; 49 } 50 T tmp=data[top]; 51 data[top]=null; 52 top--; 53 return tmp; 54 } 55 56 //============测试代码============ 57 public static void main(String[] args) { 58 ArrayStack<String> as=new ArrayStack<String>(4); 59 as.push("anhui"); 60 as.push("shanghai"); 61 as.push("beijing"); 62 as.push("nanj"); 63 //测试栈已经满了的情况 64 System.out.println(as.push("aa")); 65 for(int i=0;i<4;i++) { 66 System.out.println(as.pop()); 67 } 68 } 69 70 }
基于链表:
1 import org.junit.jupiter.api.Test; 2 3 /** 4 * 基于链表实现的栈 5 * @author wydream 6 * 7 */ 8 9 public class NodeStack<T> { 10 11 private Node<T> top=null;//栈顶 12 public NodeStack() { 13 this.top=null; 14 } 15 16 //判断栈是否为空 17 public boolean isEmpty() { 18 if(top!=null) { 19 return false; 20 } 21 return true; 22 } 23 24 //压栈 25 public boolean push(T value) { 26 Node<T> node=new Node<T>(value); 27 node.setNext(top); 28 top=node; 29 return true; 30 } 31 32 //出栈 33 public T pop() { 34 if(top==null) { 35 return null; 36 } 37 T tmp=top.data; 38 top=top.getNext(); 39 return tmp; 40 } 41 //取出栈顶的值 42 public T peek() { 43 if(isEmpty()) { 44 return null; 45 } 46 return top.data; 47 } 48 49 50 class Node<T>{ 51 private T data;//数据 52 private Node<T> next;//指向下一个节点的指针 53 //初始化链表 54 public Node(T data) { 55 this.data=data; 56 } 57 //获取下一个节点 58 public Node<T> getNext(){ 59 return this.next; 60 } 61 //设置下一个节点 62 public void setNext(Node<T> n) { 63 this.next=n; 64 } 65 //获取节点数据 66 public T getData() { 67 return this.data; 68 } 69 //设置节点数据 70 public void setData(T d) { 71 this.data=d; 72 } 73 74 } 75 76 public static void main(String[] args) { 77 78 NodeStack<String> ns=new NodeStack<String>(); 79 80 //测试是否为空 81 System.out.println("=======是否为空======"); 82 System.out.println(ns.isEmpty()); 83 System.out.println("============="); 84 //压栈测试 85 System.out.println("=======压栈======"); 86 ns.push("北京"); 87 ns.push("上海"); 88 ns.push("深证"); 89 ns.push("广州"); 90 //是否为空 91 System.out.println("=======是否为空======"); 92 System.out.println(ns.isEmpty()); 93 System.out.println("============="); 94 95 System.out.println("=======出栈======="); 96 //出栈 97 System.out.println(ns.pop()); 98 System.out.println(ns.pop()); 99 System.out.println(ns.pop()); 100 System.out.println(ns.pop()); 101 System.out.println(ns.pop()); 102 103 //是否为空 104 System.out.println("=======是否为空======"); 105 System.out.println(ns.isEmpty()); 106 System.out.println("============="); 107 108 109 } 110 }
两栈共享空间:
栈有个缺陷,必须事先确定数组的大小,这样如果栈满了的话,想在存储元素就必须通过编程手段来扩充数组的容量,这样就很麻烦。于是我们就设计一个数组,里面存放着两个栈,共享这一个数组空间,这样就可以充分利用空间。数组有两个端点,两个栈有两个栈底,让一个栈的栈底为数组的0下标,另一个栈的栈为数组的长度n-1处
代码实现:
1 import javax.crypto.Mac; 2 3 /** 4 * 两栈共享空间 5 * @author wydream 6 * 7 */ 8 9 public class DoubleStatk { 10 11 private final static int MAXSIZE=20; 12 private int[] stackElem; 13 private int top1; //将top1设置为指向栈1栈顶元素的存储位置即数组下标0 14 private int top2; //将top2设置为指向栈2栈顶元素的存储位置即数组下标n-1 15 16 public DoubleStatk() { 17 top1=-1; 18 top2=MAXSIZE; 19 stackElem=new int[MAXSIZE]; 20 } 21 22 //是否是空栈 23 public boolean isEmptyStack() { 24 if(top1==-1&&top2==MAXSIZE) { 25 return true; 26 } 27 return false; 28 } 29 30 //清空栈 31 public void clearStack() { 32 top1=-1; 33 top2=MAXSIZE; 34 } 35 36 //栈的长度 37 public int lengthStak() { 38 return (top1+1)+(MAXSIZE-top2); 39 } 40 41 //获取top1的元素 42 public int getTop1Elem() { 43 if(top1==-1) { 44 return -1; 45 } 46 return stackElem[top1]; 47 } 48 49 //获取top2的元素 50 public int getTop2Elem() { 51 if(top2==MAXSIZE) { 52 return -1; 53 } 54 return stackElem[top2]; 55 } 56 57 //压栈 58 public void stackPush(int stackNumber,int e) { 59 //如果栈已经满了 60 if(top1+1==top2) { 61 System.out.println("栈已满"); 62 return; 63 } 64 if(stackNumber==1) { 65 top1+=1; 66 stackElem[top1]=e; 67 return; 68 } 69 if(stackNumber==2) { 70 top2-=1; 71 stackElem[top2]=e; 72 return; 73 } 74 75 } 76 77 //出栈 78 public int stackPop(int stackNumber) { 79 int rs; 80 if(isEmptyStack()) { 81 System.out.println("栈为空"); 82 return -1; 83 } 84 if(stackNumber==1) { 85 rs= stackElem[top1]; 86 top1--; 87 }else if(stackNumber==2) { 88 rs=stackElem[top2]; 89 top2++; 90 }else { 91 System.out.println("输入数据有误"); 92 return -1; 93 } 94 return rs; 95 } 96 97 public void stackTraverse() { 98 System.out.println("此时,栈中的元素为:"); 99 int i=0; 100 while(i<=top1) { 101 System.out.println(stackElem[i++]+" "); 102 } 103 i=top2; 104 while(i<MAXSIZE) { 105 System.out.println(stackElem[i++]+" "); 106 } 107 System.out.println(); 108 } 109 110 111 public static void main(String[] args) { 112 DoubleStatk seqStack=new DoubleStatk(); 113 114 //1压栈 115 for(int j=1;j<=5;j++) { 116 seqStack.stackPush(1,j); 117 } 118 //2压栈 119 for(int i=MAXSIZE;i>=MAXSIZE-2;i--) { 120 seqStack.stackPush(2, i); 121 } 122 //输出 123 seqStack.stackTraverse(); 124 System.out.println("栈的长度为:"+seqStack.lengthStak()); 125 126 seqStack.stackPop(2); 127 seqStack.stackTraverse(); 128 System.out.println("栈1的栈顶元素为: " + seqStack.getTop1Elem()); 129 System.out.println("栈2的栈顶元素为: " + seqStack.getTop2Elem()); 130 System.out.println("栈的长度为: " + seqStack.lengthStak()); 131 132 for (int i = 6; i <= MAXSIZE-2; i++) { 133 seqStack.stackPush(1,i); 134 } 135 seqStack.stackTraverse(); 136 System.out.println("栈1的栈顶元素为: " + seqStack.getTop1Elem()); 137 System.out.println("栈2的栈顶元素为: " + seqStack.getTop2Elem()); 138 System.out.println("栈顶元素为: " + seqStack.getTop2Elem()); 139 System.out.println("栈的长度为: " + seqStack.lengthStak()); 140 141 System.out.println("栈是否为空: " + seqStack.isEmptyStack()); 142 seqStack.clearStack(); 143 System.out.println("栈是否为空: " + seqStack.isEmptyStack()); 144 } 145 146 147 }