代码改变世界

Java实现数据结构栈stack和队列Queue

2010-04-24 15:01  chen.simon  阅读(2588)  评论(0编辑  收藏  举报

Java实现数据结构栈stack和队列Queue

Google后发现大多数文章都是通过LinkedList类实现,当然JDK有自带的Stack

 

回顾JDK提供的集合类

容器(集合)框架如下: 

集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身。

集合类型主要有3种:set(集)、list(列表)和map(映射)

Collection接口

List 接口

│├LinkedList 链表

│├ArrayList 顺序结构动态数组类

│└Vector 向量

Stack

Map接口

Hashtable

HashMap

Set接口

 Collection<--Set<--HashSet

 Collection<--Set<--HashSet<--LinkedHashSet

 Collection<--Set<--SortedSet(也是接口)<--TreeSet

 

LinkedList, 查阅JDK

List接口的链表列表实现。实现所有可选的列表操作,并且允许所有元素(null)

LinkedList类还为在列表的开头及结尾get,removeinsert元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈,队列或双端队列

注意此实现不是同步的

 

JDK本身提供的Stack

提供了通常的pushpop操作,以及取堆栈顶点的peek方法,测试堆栈是否为空的empty方法,在堆栈中查找项并确定离栈顶的距离,共五个方法。

JDK中实现这个类本身继承自Vector这个类(since JDK1.0)

 

数据结构中 栈的定义及基本运算

栈和队列都属于线性结构,是两种在运算上受到某些限制的特殊线性表,他们比一般线性表更简单。

(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,称为栈顶(top),另一端为固定的一端,称为栈底

栈顶,栈底,空栈,栈的特性,

退栈,进栈

栈的运算:

初始化栈,进栈push,出栈pop,,取栈顶元素(即是查看下一个要出栈的元素,也叫peek),判断空

 

LinkedList实现stack

其实主要是实现 进栈push,出栈pop,,取栈顶元素这几个方法

 

package org.simoncook.examtest;

 

import java.util.LinkedList;

 

public class MyStack {

       

        private LinkedList ll = new LinkedList();

       

        public void push(Object obj){

                //将指定元素插入此列表的开头。

                ll.addFirst(obj);

        }

       

        public Object pop(){

                //移除并返回此列表的第一个元素.

                return ll.removeFirst();

        }

       

        public Object peek(){

                // 返回此列表的第一个元素。

                return ll.getFirst();

        }

       

        public boolean empty(){

                return ll.isEmpty();

        }

}

 

数据结构队列

参考

http://blogger.org.cn/blog/more.asp?name=eaglebetter&id=17232

队列(Queue)的定义

队列的特性队列的实例队 列的基本运算
1 入队操作:InQueueqx
2)出队操作:OutQueueqx
3)读队头元 素:ReadFrontqx
4)显示队列中元素ShowQueueq
5)判队空操作:QEmptyq
6)判 队满操作:QFullq
7)求队列长度Qlenq

 

实现代码:
package com.gc.list;
import java.util.*;
public class MyQueue {

 private LinkedList ll=new LinkedList();
//
入队操作
 public void put(Object o){
  ll.addLast(o);
 }
 //
使用removeFirst()方法,返回队列中第一个数据,然后将它从队列 中删除
//
出队操作
 public Object get(){
  return ll.removeFirst();
 }
 
 public boolean empty(){
  return ll.isEmpty();
 }

 

 

Java???u??stackM?CQueue
GoogleZ??jh?Oq?LinkedList???A?MJDK?Stack?

^?JDKX?
e]X^[pUG
X?s_java.util]CX?sO?HAD?HC
X?Dn3Gset(^Blist(C^Mmap(Mg)C
Collectionf
uList f
xuLinkedList ?
xuArrayList ???????
x|Vector Vq
x |Stack ?
Mapf
uHashtable
uHashMap
|Setf
 Collection<--Set<--HashSet
 Collection<--Set<--HashSet<--LinkedHashSet
 Collection<--Set<--SortedSet]]Of^<--TreeSet

LinkedList, d?JDK
Listf?C??C??i?C@A}B?(]null)
LinkedList???bC???get,removeMinsertF?@RWkC?@???C@?A?C??C
`N??OPB

JDKStack?
Fq`pushMpop@AH???peekkA???O_?emptykAb?d?}w??ZA@?kC
JDK??????Vector???(since JDK1.0)

?u? ?w??
?M?C?_??AO?b?WYS?AL?@???C
?(stack)O?JM?ub?P@?@S?C?JM?@A????(top)At@?Tw@A???
??A?A?A?SA
h?A??
??:
l?A??pushAX?popAA??]YOdU@?nX?A]speek^AP?

LinkedList??stack
?DnO?? ??pushAX?popAA???L?k

package org.simoncook.examtest;

import java.util.LinkedList;

public class MyStack {
    
    private LinkedList ll = new LinkedList();
    
    public void push(Object obj){
        //?wJC??C
        ll.addFirst(obj);
    }
    
    public Object pop(){
        //}^C@?.
        return ll.removeFirst();
    }
    
    public Object peek(){
        // ^C@?C
        return ll.getFirst();
    }
    
    public boolean empty(){
        return ll.isEmpty();
    }
}

?u??C
?http://blogger.org.cn/blog/more.asp?name=eaglebetter&id=17232
?C]Queue^w?
?CS?C?? C?
]1^ J?@GInQueue]qAx^
]2^X?@GOutQueue]qAx^
]3^??? GReadFront]qAx^
]4^??CShowQueue]q^
]5^P?@GQEmpty]q^
]6^P ??@GQFull]q^
]7^D?C?Qlen]q^

??N?G
package com.gc.list;
import java.util.*;
public class MyQueue {
 private LinkedList ll=new LinkedList();
//J?@
 public void put(Object o){
  ll.addLast(o);
 }
 //removeFirst()kA^?C@??uAMZ???C ?
//X?@
 public Object get(){
  return ll.removeFirst();
 }
 
 public boolean empty(){
  return ll.isEmpty();
 }