java数据结构- - - -栈

Posted 爱生活的Mr.Yao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数据结构- - - -栈相关的知识,希望对你有一定的参考价值。

栈:是一种容器,类似于桶一样,栈是一种特殊的线性表,不同于一般线性表的是,一般线性表可以在表内任意位置添加和删除元素,

而栈只可以在尾端进行,栈尾一般称之为栈顶,另一端称之为栈底,特点是:后进先出/先进后出。

而一般常见使用的有 顺序栈 和 链栈;顺序栈类似于数组一样,而链栈就是用链表实现的,链栈的结点特点需要有指针域和数值域。

这里首先放上顺序栈常见功能的实现:

 1 package com.demo.stackone;
 2 
 3 /**
 4 Author:yao
 5 Date:2018年9月20日
 6 Description:面试被问到栈的实现于是回来再在这里温习一下啊
 7 
 8 首先:介绍一下栈,栈是一种特殊的线性表,不同于一般线性表的是,一般线性表可以在表内任意位置添加和删除元素,
 9 而栈只可以在尾端进行,栈尾一般称之为栈顶,另一端称之为栈底,特点是:后进先出/先进后出
10 
11 stack的接口相关实现类
12 *
13 */
14 public class StackDemo implements IStack {
15     private Object[] stackElem;//定义元素对象数组
16     private int top;//在栈为非空的情况下,top始终指向栈顶元素的下一个存储位置;当栈为空时,top值为0;
17 
18     public StackDemo(int MaxSize) {
19         top = 0;
20         stackElem = new Object[MaxSize];
21     }
22 
23     @Override
24     //清空栈
25     public void clear() {
26         top = 0;
27     }
28 
29     @Override
30     //判断栈是否为空
31     public boolean isEmpty() {
32         return top == 0;
33 
34     }
35 
36     @Override
37     //栈内元素个数
38     public int length() {
39         return top;
40 
41     }
42 
43     @Override
44     //获取栈顶元素
45     public Object peek() {
46         if (!isEmpty()) {
47             return stackElem[top - 1];
48         } else {
49             return null;
50         }
51 
52     }
53 
54     //入栈操作
55     @Override
56     public void push(Object o) throws Exception {
57         if (top == stackElem.length) {
58             throw new Exception("栈已满");
59         } else {
60             stackElem[top++] = o;
61         }
62     }
63 
64     //出栈操作
65     @Override
66     public Object pop() {
67         if (isEmpty()) {
68             return null;
69         } else {
70             return stackElem[--top];
71         }
72 
73     }
74 
75     //输出栈内所有元素(栈顶--->栈底)
76     public void printAllElement() {
77         for (int i = top - 1; i >= 0; i--) {
78             System.out.print(stackElem[i].toString() + " ");
79         }
80     }
81 
82 }

然后再加上链栈常用功能的实现,首先链栈需要先添加一个Node类,属性用来存放指针域和数值域,所以先看Node类的定义

 1 package com.demo.linkstack;
 2 
 3 /**
 4 Author:yao
 5 Date:2018年10月5日
 6 Description:链表需要定义Node类,定义三大属性,(数据域,后指针)
 7 *
 8 */
 9 public class Node {
10     private Object data;
11     private Node next;
12 
13     public Node() { //初始化一个空结点
14         super();
15         // TODO Auto-generated constructor stub
16     }
17 
18     public Node(Object data) { //构造一个数据域指针为指定值,指针域为空的结点
19         super();
20         this.data = data;
21     }
22 
23     public Node(Object data, Node next) { //带有数据域和指针的结点
24         super();
25         this.data = data;
26         this.next = next;
27     }
28 
29     public Object getData() {
30         return data;
31     }
32 
33     public void setData(Object data) {
34         this.data = data;
35     }
36 
37     public Node getNext() {
38         return next;
39     }
40 
41     public void setNext(Node next) {
42         this.next = next;
43     }
44 
45     @Override
46     public String toString() {
47         return "Node [data=" + data + ", next=" + next + "]";
48     }
49 
50 }

然后我们再来看链栈具体功能的实现

package com.demo.linkstack;

/**
Author:yao
Date:2018年10月5日
Description:链栈的实现原理
*
*/
public class LinkedStack implements LinkStack {
    private Node top; //栈顶元素的引用

    //将栈置空
    @Override
    public void clear() {
        top = null;
    }

    //判断栈是否为空
    @Override
    public boolean isEmpty() {
        return top == null;

    }

    //获得栈的长度
    @Override
    public int length() {
        Node p = top;
        int length = 0;
        while (p != null) {
            p = p.getNext();
            ++length;
        }
        return length;

    }

    //获取栈顶元素并且返回
    @Override
    public Object peek() {
        if (!isEmpty()) {
            return top;
        } else {
            return null;
        }

    }

    //入栈
    @Override
    public void push(Object o) throws Exception {
        Node node = new Node(o);
        node.setNext(top);
        top = node;

    }

    //出栈
    @Override
    public Object pop() {
        if (isEmpty()) {
            return null;
        } else {
            Node p = top; //指向要被删除的结点
            top = top.getNext();//修改顶部指针,原来顶部的下一个节点现在为新的栈顶
            return p.getData(); //返回新的栈顶元素数值
        }

    }

    //输出链栈中的所有元素
    public void printAll() {
        Node p = top;
        while (p != null) {
            System.out.print(p.getData().toString() + " ");
            p = p.getNext();
        }
    }

}

 上述代码都是实现了接口,所以把接口的定义放上去

public interface LinkStack {
    public void clear();//清空栈

    public boolean isEmpty();//判断栈是否为空

    public int length();//返回栈中元素的个数

    public Object peek();//取栈顶元素并且返回其值,如果栈是空,就返回null

    public void push(Object o) throws Exception;//入栈

    public Object pop();//出栈
}

 

以上是关于java数据结构- - - -栈的主要内容,如果未能解决你的问题,请参考以下文章

java相关——数据结构与算法+Java线程并发教程+Java设计模式系列 + Java8 新特性教程

java 本地数据存储问题

数据库中的数据类型与java语言中的数据类型

Java基础系列1:深入理解Java数据类型

java中树形结构怎么实现

java获取响应数据,急问。