• 算法——Java实现栈


     定义:

    栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈

    栈的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 }
  • 相关阅读:
    Enum 枚举值 (一) 获取描述信息
    sqlbulkcopy 批量更新 数据库
    linq partition by
    C#委托的介绍(delegate、Action、Func、predicate)ga
    安装Tomcat
    安装 oracle
    468 Validate IP Address 验证IP地址
    467 Unique Substrings in Wraparound String 封装字符串中的独特子字符串
    464 Can I Win 我能赢吗
    463 Island Perimeter 岛屿的周长
  • 原文地址:https://www.cnblogs.com/wugongzi/p/11187183.html
Copyright © 2020-2023  润新知