栈是一个先进后出的数据结构,本篇文章使用链表来实现一个栈。
一、定义栈的方法接口
这里定义了栈的几个主要方法:
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