棧是一個先進後出的數據結構,本篇文章使用鏈表來實現一個棧。
一、定義棧的方法接口
這裏定義了棧的幾個主要方法:
public interface IStack<E> {
/**
* 棧元素大小
* @return
*/
int size();
/**
* 是否爲空
* @return
*/
boolean empty();
/**
* 壓棧
* @param item
*/
void push(E item);
/**
* 彈棧
* @return
*/
E pop();
/**
* 查看棧頂元素
* @return
*/
E peek();
}
二、實現
/**
* 通過鏈表實現棧
* @param <E>
*/
public class LinkedStack<E> implements IStack<E> {
private static class Node<E>{
public E data; // 數據域
public Node<E> next; // 指針域
public Node(E data, Node<E> next){
this.data = data;
this.next = next;
}
}
// 棧頂元素/節點 , 鏈表最後的那個元素
private Node<E> top;
private int size = 0; // 棧中元素數量
public LinkedStack(){
top = null;
size = 0;
}
/**
* 棧元素大小
* @return
*/
@Override
public int size() {
return size;
}
/**
* 是否爲空
* @return
*/
@Override
public boolean empty() {
return size == 0;
}
/**
* 壓棧
* @param item
*/
@Override
public void push(E item) {
top = new Node(item, top);
size ++;
}
/**
* 彈棧
* @return
*/
@Override
public E pop() {
if(size == 0){
throw new EmptyStackException();
}
E result = top.data;
top = top.next;
return result;
}
/**
* 查看棧頂元素
* @return
*/
@Override
public E peek() {
if(size == 0){
throw new EmptyStackException();
}
return top.data;
}
public static void main(String[] args) {
IStack<Integer> stack = new LinkedStack<>();
for (int i = 0; i < 10; i++) {
stack.push(i+1);
}
System.out.println("彈出元素:"+stack.pop());
System.out.println("彈出元素:"+stack.pop());
for (int i = 0; i < 8; i++) {
System.out.println("彈出剩餘元素:"+stack.pop());
}
}
}
測試結果:
彈出元素:10
彈出元素:9
彈出剩餘元素:8
彈出剩餘元素:7
彈出剩餘元素:6
彈出剩餘元素:5
彈出剩餘元素:4
彈出剩餘元素:3
彈出剩餘元素:2
彈出剩餘元素:1