zoukankan      html  css  js  c++  java
  • 数据结构栈的java实现

    近来复习数据结构,自己动手实现了栈。栈是一种限制插入和删除只能在一个位置上的表。最基本的操作是进栈和出栈,因此,又被叫作“先进后出”表。

    实现方式是这样的:首先定义了一个接口,然后通过这个接口实现了线性栈和链式栈,代码比较简单,如下:

     1 package com.peter.java.dsa.interfaces;
     2 
     3 /**
     4  * 栈操作定义
     5  * 
     6  * @author Peter Pan
     7  */
     8 
     9 public interface Stack<T> {
    10     /* 判空 */
    11     boolean isEmpty();
    12 
    13     /* 清空栈 */
    14     void clear();
    15 
    16     /* 弹栈 */
    17     T pop();
    18 
    19     /* 入栈 */
    20     boolean push(T data);
    21 
    22     /* 栈的长度 */
    23     int length();
    24 
    25     /* 查看栈顶的元素,但不移除它 */
    26     T peek();
    27 
    28     /* 返回对象在栈中的位置 */
    29     int search(T data);
    30 }
    View Code

    线性栈:以数组的方式实现。

      1 package com.peter.java.dsa.common;
      2 
      3 import com.peter.java.dsa.interfaces.Stack;
      4 
      5 /**
      6  * 线性栈
      7  * 
      8  * @author Peter Pan
      9  */
     10 public class LinearStack<T> implements Stack<T> {
     11     @SuppressWarnings("unchecked")
     12     private T[] t = (T[]) new Object[16];
     13     private int size = 0;
     14 
     15     @Override
     16     public boolean isEmpty() {
     17         // TODO Auto-generated method stub
     18         return size == 0;
     19     }
     20 
     21     @Override
     22     public void clear() {
     23         // TODO Auto-generated method stub
     24         for (int i = 0; i < t.length; i++) {
     25             t[i] = null;
     26         }
     27         size = 0;
     28     }
     29 
     30     @Override
     31     public T pop() {
     32         // TODO Auto-generated method stub
     33         if (size == 0) {
     34             return null;
     35         }
     36         T tmp = t[size - 1];
     37         t[size - 1] = null;
     38         size--;
     39         return tmp;
     40     }
     41 
     42     @Override
     43     public boolean push(T data) {
     44         // TODO Auto-generated method stub
     45         if (size >= t.length) {
     46             resize();
     47         }
     48         t[size++] = data;
     49         return true;
     50     }
     51 
     52     @Override
     53     public int length() {
     54         // TODO Auto-generated method stub
     55         return size;
     56     }
     57 
     58     @Override
     59     public T peek() {
     60         // TODO Auto-generated method stub
     61         if (size == 0) {
     62             return null;
     63         } else {
     64             return t[size - 1];
     65         }
     66     }
     67 
     68     /* return index of data, return -1 if no data */
     69     @Override
     70     public int search(T data) {
     71         // TODO Auto-generated method stub
     72         int index = -1;
     73         for (int i = 0; i < t.length; i++) {
     74             if (t[i].equals(data)) {
     75                 index = i;
     76                 break;
     77             }
     78         }
     79         return index;
     80     }
     81 
     82     @SuppressWarnings("unchecked")
     83     private void resize() {
     84         T[] tmp = (T[]) new Object[t.length * 2];
     85         for (int i = 0; i < t.length; i++) {
     86             tmp[i] = t[i];
     87             t[i] = null;
     88         }
     89         t = tmp;
     90         tmp = null;
     91     }
     92 
     93     /* from the left to the right is from the top to the bottom of the stack */
     94     @Override
     95     public String toString() {
     96         // TODO Auto-generated method stub
     97         StringBuffer buffer = new StringBuffer();
     98         buffer.append("Linear Stack Content:[");
     99         for (int i = t.length - 1; i > -1; i--) {
    100             buffer.append(t[i].toString() + ",");
    101         }
    102         buffer.append("]");
    103         buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
    104         return buffer.toString();
    105     }
    106 
    107 }
    View Code

    链式栈:通过单链表进行实现。

      1 package com.peter.java.dsa.common;
      2 
      3 import com.peter.java.dsa.interfaces.Stack;
      4 
      5 public class LinkedStack<T> implements Stack<T> {
      6     private Node top;
      7     private int size;
      8 
      9     @Override
     10     public boolean isEmpty() {
     11         // TODO Auto-generated method stub
     12         return size == 0;
     13     }
     14 
     15     @Override
     16     public void clear() {
     17         // TODO Auto-generated method stub
     18         top = null;
     19         size = 0;
     20     }
     21 
     22     @Override
     23     public T pop() {
     24         // TODO Auto-generated method stub
     25         T topValue = null;
     26         if (top != null) {
     27             topValue = top.data;
     28             Node oldTop = top;
     29             top = top.prev;
     30             oldTop.prev = null;
     31             size--;
     32         }
     33         return topValue;
     34     }
     35 
     36     @Override
     37     public boolean push(T data) {
     38         // TODO Auto-generated method stub
     39         Node oldTop = top;
     40         top = new Node(data);
     41         top.prev = oldTop;
     42         size++;
     43         return true;
     44     }
     45 
     46     @Override
     47     public int length() {
     48         // TODO Auto-generated method stub
     49         return size;
     50     }
     51 
     52     @Override
     53     public T peek() {
     54         // TODO Auto-generated method stub
     55         T topValue = null;
     56         if (top != null) {
     57             topValue = top.data;
     58         }
     59         return topValue;
     60     }
     61 
     62     @Override
     63     public int search(T data) {
     64         // TODO Auto-generated method stub
     65         int index = -1;
     66         Node tmp = top;
     67         for (int i = size - 1; i > -1; i--) {
     68             if (tmp.data.equals(data)) {
     69                 index = i;
     70                 break;
     71             } else {
     72                 tmp = tmp.prev;
     73             }
     74         }
     75         tmp = null;
     76         return index;
     77     }
     78 
     79     @Override
     80     public String toString() {
     81         // TODO Auto-generated method stub
     82         StringBuffer buffer = new StringBuffer();
     83         buffer.append("Linked Stack Content:[");
     84         Node tmp = top;
     85         for (int i = 0; i < size - 1; i++) {
     86             buffer.append(tmp.toString() + ",");
     87             tmp = tmp.prev;
     88         }
     89         tmp = null;
     90         buffer.append("]");
     91         buffer.replace(buffer.lastIndexOf(","), buffer.lastIndexOf(",") + 1, "");
     92         return super.toString();
     93     }
     94 
     95     private class Node {
     96         T data;
     97         Node prev;
     98 
     99         public Node(T data) {
    100             // TODO Auto-generated constructor stub
    101             this.data = data;
    102         }
    103     }
    104 
    105 }
    View Code

    学习还在进行中,以后会继续更新代码。

    谢谢打赏!
    您的支持就是我的最大动力!


    支付宝

    微信


    Just remember: Half is worse than none at all.

    本文是由SilentKnight诚意发布, 欢迎转载! 但转载请注明出处: 【SilentKnight】
    如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来更好的技术文章!
    想跟我一起进步么?那就【关注】我吧

    如果,想给予我更多的鼓励,求打

  • 相关阅读:
    TLS1.3 认证和秘钥建立握手环节的分析
    使用华为云+GitHub搭建自己的博客
    TLS1.3 握手协议的分析
    Formal Analysis of the TLS Handshake Protocol -----论文整理
    TLS1.3 握手过程特性的整理
    TLS1.3 PPT 整理
    SSL/TLS 握手协议简述
    TLS握手秘钥套件分析
    Scyther-Compromise 协议形式化安全分析如何改进协议
    HTTP 协议部分常识简介
  • 原文地址:https://www.cnblogs.com/littlepanpc/p/3436419.html
Copyright © 2011-2022 走看看