服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服务器之家 - 编程语言 - JAVA教程 - 用Java代码实现栈数据结构的基本方法归纳

用Java代码实现栈数据结构的基本方法归纳

2020-01-02 14:23zinss26914 JAVA教程

这篇文章主要介绍了用Java代码实现栈数据结构的基本方法归纳,各种算法的实现也是ACM上经常出现的题目,是计算机学习的基本功,需要的朋友可以参考下

链式实现:

在栈的一段添加和删除元素,在栈中维护一个指向栈顶的结点和一个count变量指示栈的大小:
private LinearNode top; //指向栈顶
private int count;//标记栈的大小
每次出栈和压栈在链表的表头:(也可以再表尾,实现方式不一样而已)
top--->元素1--->元素2--->元素3.........
实现(附带测试main):
LinkedStack

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package Stack;
import Bag.LinearNode;
//为了重点来实现算法,将异常情况直接打印出然后退出程序,不再声明异常类
public class LinkedStack implements StackADT {
  private LinearNode top; //指向栈顶
  private int count;//标记栈的大小
  public static void main(String[] args){
    LinkedStack stack = new LinkedStack();
    System.out.println("将0到10依次压栈");
    for(int i = 0;i < 10;i++)
      stack.push(i);
    System.out.println("连续执行5次出栈操作");
    for(int i = 0;i < 5;i++)
      stack.pop();
    System.out.println("栈为空吗?: " + stack.isEmpty());
    System.out.println("栈的大小为: " + stack.size());
    System.out.println("栈顶元素为: " + stack.top.getElement());
    System.out.println("栈顶元素为: " + stack.peek()); 
  }
  public LinkedStack()
  {
    top = null;
    count = 0;
  }
  public int size() {
    return count;
  }
  public boolean isEmpty() {
    return (size() == 0);
  }
  public void push(Object element) {
    LinearNode node = new LinearNode(element);
    node.setNext(top);
    top = node;
    count++;
  }
  public Object pop() {
    if(isEmpty())
    {
      System.out.println("stack is empty!");
      System.exit(1);
    }
    Object result = top.getElement();
    top = top.getNext();
    count--;
    return result;
  }
  public Object peek() {
    Object result = top.getElement();
    return result;
  }
}

运行结果:
将0到10依次压栈
连续执行5次出栈操作
栈为空吗?: false
栈的大小为: 5
栈顶元素为: 4
栈顶元素为: 4

数组实现:

栈底总是数组下标为0的位置,入栈出栈从数组下标的最后一个元素开始:

?
1
2
private Object[] contents;
private int top;//top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!

实现(附带测试main):
ArrayStack

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package Stack;
public class ArrayStack implements StackADT {
  private Object[] contents;
  private int top;//top标记下一个入栈的位置,同时也表示栈的容量大小,跟链式实现的count比较一下!!!
  private static int SIZE = 10;
  public ArrayStack()
  {
    contents = new Object[SIZE];
    top = 0;
  }
  public void expand(){//借助于申请一个辅助空间,每次扩展容量一倍
    Object[] larger = new Object[size()*2];
    for(int index = 0;index < top;index++)
      larger[index] = contents[index];
    contents = larger;
  }
  public int size() {
    return top;
  }
  public boolean isEmpty() {
    return (size() == 0);
  }
  public void push(Object element) {
    //if(isEmpty())
      //expand();
    if(top == contents.length)
      expand();
    contents[top] = element;
    top++;
  }
  public Object pop() {
    if(isEmpty())
    {
      System.out.println("stack is empty!");
      System.exit(1);
    }
    Object result = contents[top-1];
    contents[top-1] = null;//出栈
    top--;
    return result; 
    /*书上这样写简便一点:::
     * top--;
     * Object result = contents[top];
     * contents[top] = null;*/   
  }
  public Object peek() {
    Object result;
    if(isEmpty())
      result = null;
    else
      result = contents[top-1];
    return result;
  }
  public static void main(String[] args) {
    ArrayStack stack = new ArrayStack();
    System.out.println("将0到24依次压栈,然后连续10次出栈");
    for(int i = 0;i < 25;i++)
      stack.push(i);
    for(int i = 0;i < 10;i++)
      stack.pop();
    System.out.println("栈的大小为: " + stack.size());
    System.out.println("栈为空吗?: " + stack.isEmpty());
    System.out.println("栈顶元素为: " + stack.peek());
  }
}

运行结果:
将0到24依次压栈,然后连续10次出栈
栈的大小为: 15
栈为空吗?: false
栈顶元素为: 14

使用集合LinkedList来模拟栈
方法
java的泛型可以让LinkedList模拟存储各种数据类型的栈,包括int,double,String,Object等等,介绍一下几种用到的API接口:

入栈

?
1
void addFirst(E e); // 将指定元素插入此列表的开头


获取栈顶元素

?
1
E getFirst(); // 返回此列表的第一个元素


出栈

?
1
E removeFirst(); // 移除并返回此列表第一个元素


判栈空

?
1
boolean isEmpty(); // 判断栈空

 

示例代码

   

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.util.LinkedList;
 import java.util.NoSuchElementException;
  
  
 public class SimulateStack {
   private LinkedList<Integer> stack = new LinkedList<Integer>();
    
   public boolean isEmpty() {
     return this.stack.isEmpty();
   }
    
   public void push(int data) {
     this.stack.addFirst(data);
   }
    
   public int pop() throws NoSuchElementException{
     return this.stack.removeFirst();
   }
    
   public int getTop() throws NoSuchElementException{
     return this.stack.getFirst();
   }
    
   public static void main(String args[]) {
     SimulateStack s = new SimulateStack();
      
     s.push(1);
     s.push(2);
     s.push(3);
      
     while (! s.isEmpty()) {
       int data = s.getTop();
       System.out.println(data);
       s.pop();
     }
   }
 }

延伸 · 阅读

精彩推荐
  • JAVA教程SpringMVC文件上传 多文件上传实例

    SpringMVC文件上传 多文件上传实例

    这篇文章主要介绍了SpringMVC文件上传 多文件上传实例,有需要的朋友可以参考一下 ...

    java教程网3732019-11-01
  • JAVA教程java获取ip地址示例

    java获取ip地址示例

    在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户...

    Java教程网3802019-11-18
  • JAVA教程从java面试题了解你所模糊的数组

    从java面试题了解你所模糊的数组

    这篇文章主要介绍了从java面试题了解你所模糊的数组,数组用来存储一系列的数据项,其中的每一项具有相同的基本数据类型、类或相同的父类。通过使用...

    话尔loony1932019-06-27
  • JAVA教程教你如何编写简单的网络爬虫

    教你如何编写简单的网络爬虫

    实际的爬虫是从一系列的种子链接开始。种子链接是起始节点,种子页面的超链接指向的页面是子节点(中间节点),对于非html文档,如excel等,不能从中...

    java之家4602019-10-16
  • JAVA教程JAVA中STRING的常用方法小结

    JAVA中STRING的常用方法小结

    这篇文章介绍了JAVA中STRING的常用方法,有需要的朋友可以参考一下 ...

    JAVA之家3402019-10-13
  • JAVA教程用代码更新你的jar包

    用代码更新你的jar包

    这篇文章主要介绍了用程序代码更新com目录下的所有文件到jar的对应目录结构中去,这样可以做到自动更新程序吧 ...

    java教程网4222019-11-03
  • JAVA教程解析Java中的默认方法

    解析Java中的默认方法

    这篇文章主要介绍了Java中的默认方法,包括继承和调用等Java入门学习中的基础知识,需要的朋友可以参考下 ...

    goldensun1192019-12-26
  • JAVA教程java实现冒泡排序算法

    java实现冒泡排序算法

    冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工...

    hebedich2662019-12-15