使用LinkList实现栈
栈(Stack)也是一种特殊的线性表,是一种后进先出(LIFO)的结构。
栈是限定仅在表尾进行插入和删除运算的线性表,表尾称为栈顶(top),表头称为栈底(bottom)。
栈的物理存储可以用顺序存储结构,也可以用链式存储结构。
使用LinkList实现栈LIFO(后进先出)
代码
import java.util.LinkedList;
/**
* 使用LinkList实现栈LIFO(后进先出)
*/
public class MyStack {
private LinkedList<Object> ll = new LinkedList<Object>();
/**
* 添加元素
*
* @param e
*/
public void addElements(Object e) {
ll.addFirst(e);
}
/**
* 头元素出栈 对于一个栈来说,当一个将要出栈的元素出栈了,那么这个元素就在栈
* 中不存在了,所以不能使用getFirst(),而应该使用removeFirst()。
*/
public Object outElements() {
return ll.removeFirst();
}
/**
* 查看栈顶元素
*/
public Object getHeadElement() {
return ll.getFirst();
}
/**
* 判断列表是否为空
*/
public boolean empty() {
return ll.isEmpty();
}
public int getSize() {
return ll.size();
}
/**
* 判断peek()和getFirst()返回的结果是否一样
*
* @return
*/
public boolean peekGetFirst() {
boolean bool = false;
if (ll.peek().equals(ll.getFirst())) {
bool = true;
}
return bool;
}
/**
* 检索并删除此列表头 (第一个元素)元素 这里的第一个元素就是添加元素的时候的第一个。
* 如果有其它某个操作将添加时的第一个元素删除了,那么这里就会返回null
*
* @return
*/
public Object pl() {
return ll.poll();
}
/**
* 判断remove()和poll()用法是否一样
* 肯定是返回false,没有怀疑的。
*
* @return
*/
public boolean removePoll() {
boolean bool = false;
if (ll.remove().equals(ll.poll())) {
bool = true;
}
return bool;
}
/**
* 移除第一次出现的指定元素o
* 既然有移除第一次出现的指定元素,那么当然也就有移除最后一次出现的元素的函数。
*
* @param o
* @return
*/
public boolean removeFirstShow(Object o) {
boolean bool = false;
if (ll.removeFirstOccurrence(o)) {
bool = true;
}
return bool;
}
}
MyStackTest.java
public class MyStackTest {
/**
* @param args
*/
public static void main(String[] args) {
MyStack ms = new MyStack();
// 添加元素
ms.addElements("a");
ms.addElements("a");
ms.addElements("b");
ms.addElements("c");
// 列表长度
System.out.println("列表长度:" + ms.getSize());
// 移除第一次出现的指定元素
System.out.println("移除第一次出现的指定元素:" + ms.removeFirstShow("c"));
// 判断列表是否真的移除第一次出现的指定元素c
// 如果比上一次少1,则说明真的成功
System.out.println("列表长度:" + ms.getSize());
// 头元素出栈
System.out.println("头元素出栈:" + ms.outElements());
// 查看栈顶元素
System.out.println("栈顶元素:" + ms.getHeadElement());
// 头元素出栈
System.out.println("头元素出栈:" + ms.outElements());
// 查看栈顶元素
System.out.println("栈顶元素:" + ms.getHeadElement());
// 判断列表是否为空
System.out.println("列表为空吗?" + ms.empty());
// 列表长度
System.out.println("列表长度:" + ms.getSize());
// 判断判断peek()和getFirst()返回的结果是否一样
System.out.println(ms.peekGetFirst());
// 判断remove()和poll()用法是否一样
// 毫无疑问返回false
System.out.println(ms.removePoll());
// 检索并删除此列表头 (第一个元素)元素
// 如果之前没有任何操作将第一个元素删除,那么这里将会返回c
System.out.println(ms.pl());
}
}
运行结果:
列表长度:4
移除第一次出现的指定元素:true
列表长度:3
头元素出栈:b
栈顶元素:a
头元素出栈:a
栈顶元素:a
列表为空吗?false
列表长度:1
true
false
null
添加元素和移除元素的比较:
public boolean offer(E e) 将指定元素添加到此列表的末尾(最后一个元素)。 |
public void addLast(E e) 将指定元素添加到此列表的结尾。 此方法等效于add(E) |
public boolean offerLast(E e)在此列表末尾插入指定的元素。 |
public void push(E e)将元素推入此列表所表示的堆栈。换句话说,将该元素插入此列表的开头。 此方法等效于addFirst(E)。 |
public boolean add(E e) 将指定元素添加到此列表的结尾。此方法等效于addLast(E)。 |
public void addFirst(E e) 将指定元素插入此列表的开头。 |
public E poll()获取并移除此列表的头(第一个元素) |
public E remove()获取并移除此列表的头(第一个元素)。 |
public E removeFirst()移除并返回此列表第一个元素。 |