链表
下压栈实现
public class Stack<Item>{
private Node first;//栈顶(最近添加元素)
private int N;//元素数量
private class Node{
//定义节点的嵌套类
Item item;
Node next;
}
public boolean isEmpty(){
return first==null;
}
public int size(){
return N;
}
public void push(Item item){
//向栈顶添加元素
Node oldfirst = first;
first=new Node();
first.item=item;
first.next=oldfirst;
N++;
}
public Item pop(){
//从栈顶删除元素
Item item = first.item;
first = first.next;
N--;
return item;
}
}
理解:
内部类有两个作用:一个是连接链表,另一个是存储内容
外部类起到的一个作用就是表明栈顶
对栈做删除和增加的工作时,我们需要进行两块操作——对链接的操作和对内容的操作。
从另一个角度来讲,类node 起着内容提供者和关系链接者的作用。链表包含链接和内容两部分,所以对链表进行操作时要考虑到两方面
队列实现
public class Queue<Item>{
private Node first;
private Node last;
private int N;
private class Node
{
Item item;
Node next;
}
public boolean isEmpty(){
return first == null ;
}
public int size(){
return N;
}
public void enqueue(Item item)
{// ADD
Node oldlast = last;
last = new Node();
last.item=item;
last.next=null;
if(isEmpty()){
first = last;
}
else oldlast.next=last;
N++;
}
public Item dequeue()
{// DELETE
Item item = first.item;
first = first.next;
if(isEmpty()) last = null;
N--;
return item;
}
}
原理同上,在此不赘述
背包实现
import java.util.Iterator;
import org.junit.Test;
public class Bag implements Iterable
{
private Node first;
private class Node{
Item item;
Node next;
}
@Test
public void add(Item item)
{// 和stack的push 方法相同
Node oldfirst = first;
first=new Node();
first.item=item;
first.next=oldfirst;
}
@Test
@Override
public Iterator<Item> iterator()
{
// TODO Auto-generated method stub
return new ListIterator();
}
private class ListIterator implements Iterator<Item>
{
private Node current =first;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return current !=null;
}
@Override
public Item next() {
// TODO Auto-generated method stub
Item item = current.item;
current = current.next;
return item;
}
}
}
问题:背包的顺序不是无序的吗?怎么体现?感觉是顺序输出啊