1. 程式人生 > >java數據結構- - - -棧

java數據結構- - - -棧

peek 原理 特殊 linked int todo 返回棧 his 鏈棧的實現

棧:是一種容器,類似於桶一樣,棧是一種特殊的線性表,不同於一般線性表的是,一般線性表可以在表內任意位置添加和刪除元素,

而棧只可以在尾端進行,棧尾一般稱之為棧頂,另一端稱之為棧底,特點是:後進先出/先進後出。

而一般常見使用的有 順序棧 和 鏈棧;順序棧類似於數組一樣,而鏈棧就是用鏈表實現的,鏈棧的結點特點需要有指針域和數值域。

這裏首先放上順序棧常見功能的實現:

 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數據結構- - - -棧