ADT基础(一)—— List,Stack,and Queue

1 List 表示

  • 数组:易于search,难于insert和remove

  • 链表:难于search,易于insert和remove

    //Node类,LinkedList类
    public class LinkedList{
    Node head = null;
    class Node{ //element和next
    object element;
    Node next;
    Node(object e){
    this.element = e;
    }
    }
    //输出链表并获取长度
    int getLength(){
    int length = 0;
    Node tmp = head;
    while(tmp != null){
    length++;
    System.out.println(tmp.data);
    tmp = tmp.next;
    }
    return length;
    }
    //查询element为e的第一个位置
    int getIndex(object e){
    int index = -1;
    Node tmp = head;
    while(tmp!=null){
    index++:
    if(tmp.element == e){
    return index;
    }
    tmp = tmp.next;
    }
    return -1;
    }
    //获取指定位置的element
    object getObject(int index){
    if(index<0||index >= getLength()) //print fault;
    Node tmp = head;
    if(head==null) //print fault;
    for(int i=0;i<index;i++){
    tmp = tmp.next;
    }
    return tmp.element;
    }
    //头插法
    void addHead(object e){
    Node newNode = new Node(e);
    newNode.next = head;
    head = newNode;
    }
    //尾插法
    void addTail(object e){
    Node newNode = new Node(e);
    if(head == null) head = newNode;
    else{
    Node tmp = head;
    while(tmp.next != null){
    tmp = tmp.next;
    }
    tmp.next = newNode;
    }
    }
    //随机节点插入法
    void insert(int index,object e){
    int size = getLength();
    if(index>=size||index<0) //print fault;
    if(index==0) addHead(e);
    else if(index == size-1) addTail(e);
    else{
    Node pre = head;
    Node cur = head.next;
    for(int i=0;i<index-1;i++){
    pre = pre.next;
    cur = cur.next;
    }
    //pre保存索引上一个节点,cur保存索引值当前节点
    Node newNode = new Node(e);
    pre.next = newNode;
    newNode.next = cur;
    }
    }
    //删除头节点
    void deleteHead(){
    if(head == null) return;
    head = head.next;
    }
    //删除尾节点
    void deleteTail(){
    if(head==null) return;
    Node btmp = head;
    Node tmp = btmp.next;
    if(tmp == null){
    head = null;
    return;
    }
    while(tmp.next != null){
    btmp = tmp;
    tmp = tmp.next;
    }
    btmp.next = null;
    }
    //随机删除节点
    void remove(int index){
    int size = getLength();
    if(index<0||index>=size) //print fault;
    if(index == 0) deleteHead();
    else if(index == size-1) deleteTail();
    else{
    Node pre = head;
    for(int i=0;i<index-1;i++){
    pre = pre.next;
    }
    pre.next = pre.next.next;
    }
    }
    }
    //由单链表的增加删除可以看出,链表想要对指定索引进行操作(增加,删除),则必须获取该索引的前一个元素。记住这句话,对链表算法题很有用。

2 Stack表示

  • 后入先出
//栈的链表实现,栈顶在topOfStack,即head处;
//push和pop都在head处
public class StackLi
{
public StackLi( ){ topOfStack = null; }
public boolean isFull( ){ return false; }
public boolean isEmpty( ){ return topOfStack = = null; }
public void makeEmpty( ){ topOfStack = null; }
public void push( object x){
topOfStack = new ListNode(x,topOfStack);
}
public object top(){
if(topOfStack == null) return null;
return topOfStack.element;
}
public void pop() throws Underflow{
if(topOfStack == null) throw new Underflow();
topOfStack = topOfStack.next;
}
public object topAndPop( ){
if(topOfStack == null) return null;
object res = topOfStack.element;
topOfStack = topOfStack.next;
return res;
}
private ListNode topOfStack;
}
//栈的数组实现,栈顶在topOfStack,即在数组n-1位上(假设压入n个元素);
//push和pop依次向后或向前
public class stackAr{
public StackAr( ){
this(DEFAULT_CAPACITY);
}
public StackAr(int capacity){
theArray = new object[capacity];
topOfStack = -1;
}
public boolean isEmpty( ){ return topOfStack == -1; }
public boolean isFull( ){ return topOfStack == theArray.length –1; }
public void makeEmpty( ){ topOfStack = -1; }
public void push( object x ) throws overflow{
if(topOfStack == theArray.length - 1) throw new Overflow();
topOfStack++;
theArray[topOfstack] = x;
}
public object top( ){
if(topOfStack==-1) return null;
return theArray[topOfStack];
}
public void pop( ) throws Underflow{
if(topOfStack == -1) throw new Undewflow();
theArray[topOfStack] == null;
topOfStack--;
}
public object topAndPop( ){
if(topOfStack==-1) return null;
object res = theArray[topOfStack];
theArray[topOfStack] == null;
topOfStack--;
return res;
} private object [ ] theArray;
private int topOfStack;
static final int DEFAULT_CAPACITY = 10;
}

3 Queue表示

  • 插入与删除在不同端,先入先出
//队列的数组实现,在front位删除,在back位插入  front到back由0到n-1
public class QueueAr
{
public QueueAr(){
this(DEFAULT_CAPACITY);
}
public QueueAr( int capacity){
theArray = new Object[capacity];
currentSize = 0;
front = 0;
back = -1;
}
public boolean isEmpty( ){ return currentsize == 0; }
public boolean isfull( ){ return currentSize == theArray.length; }
public Object getfront( )
public void enqueue( Object x ) throw Overflow{
if(currentSize == theArray.length) throw new Overflow();
back++;
if(back == theArray.length) back = 0; //队列满则新元素回到0位插入
theArray[back] = x;
currentSize++;
}
private Object dequeue( ){
if(currentSize == 0) return null;
curretSize--;
object res = theArray[front];
theArray[front] = null;
front++;
if(front == theArray.length) front = 0; //队列删到尾则回到0删除
return res;
} private Object [ ] theArray;
private int currentSize;
private int front; //删除
private int back; //插入 static final int DEFAULT_CAPACITY = 10;
}
//队列的链表实现,front在head
public class LinkedQueue
{
public LinkedQueue(){
this.head = null;
this.tail = null;
this.size = 0;
}
public boolean IsEmpty(){return size==0;}
public boolean IsFull(){return false};
public void add(object x){
if(size==0){
head = new Node(x);
tail = head;
size++;
}else{
tail.next = new Node(x);
tail = tail.next;
size++;
}
} public object delete(){
if(size==0) return null;
object res = head.element;
head = head.next;
if(head == null) tail = null; //head为null,代表已经行进到tail.next,此时为空链表
size--;
return res;
} private Node head;
private Node tail;
private int size;
};

ADT基础(一)—— List,Stack,and Queue的更多相关文章

  1. page74-泛型可迭代的基础集合数据类型的API-Bag+Queue+Stack

    [泛型可迭代的基础集合数据类型的API] 背包:就是一种不支持从中删除元素的集合数据类型——它的目的就是帮助用例收集元素并迭代遍历所有收集到的元素.(用例也可以检查背包是否为空, 或者获取背包中元素的 ...

  2. bfs和dfs辨析—基础复习(从stack和queue的角度来理解区别,加深理解,不再模糊)

    参考: https://www.cnblogs.com/Tovi/articles/6194815.html https://blog.csdn.net/dangzhangjing97/article ...

  3. Java容器:Stack,Queue,PriorityQueue和BlockingQueue

    Stack Queue PriorityQueue BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue ...

  4. ADT基础(二)—— Tree,Heap and Graph

    ADT基础(二)-- Tree,Heap and Graph 1 Tree(二叉树) 先根遍历 (若二叉树为空,则退出,否则进行下面操作) 访问根节点 先根遍历左子树 先根遍历右子树 退出 访问顺序为 ...

  5. Java集合的Stack、Queue、Map的遍历

    Java集合的Stack.Queue.Map的遍历   在集合操作中,常常离不开对集合的遍历,对集合遍历一般来说一个foreach就搞定了,但是,对于Stack.Queue.Map类型的遍历,还是有一 ...

  6. [STL]deque和stack、queue

    怎么说呢,deque是一种双向开口的连续线性空间,至少逻辑上看上去是这样.然而事实上却没有那么简单,准确来说deque其实是一种分段连续空间,因此其实现以及各种操作比vector复杂的多. 一.deq ...

  7. python实现之极简stack和queue

    用python实现一个极简的stack和queue,那是so easy的事情了,简洁易懂,适合小白~ 直接上代码吧: node: class LinkNode: def __init__( self, ...

  8. C++ STL stack和queue

    C++ STL中独立的序列式容器只有vector,list,deque三种,stack和queue其实就是使用容器适配器对deque进行了封装,使用了新接口. 使用标准库的栈和队列时,先包含相关的头文 ...

  9. 剑指offer——stack与queue的互相实现

    我们知道,stack和queue是C++中常见的container.下面,我们来探究下如何以stack来实现queue,以及如何用queue来实现stack. 首先,先了解下stack与queue的基 ...

随机推荐

  1. yum.repos.d中的变量($releasever与$basearch)

    今天打算更新一下centos的repo源,把原先国外的repo地址换成国内的,速度快一些.主要替换的文件是/etc/yum.repos.d/Centos-Base.repo .替换的时候,不知道大家有 ...

  2. python实现经典排序算法

    以下排序算法最终结果都默认为升序排列,实现简单,没有考虑特殊情况,实现仅表达了算法的基本思想. 冒泡排序 内层循环中相邻的元素被依次比较,内层循环第一次结束后会将最大的元素移到序列最右边,第二次结束后 ...

  3. 【繁星Code】如何在EF将实体注释写入数据库中

    最近在项目中需要把各个字段的释义写到数据库中,该项目已经上线很长时间了,数据库中的字段没有上千也有上百个,要是一个项目一个项目打开然后再去找对应字段查看什么意思,估计要到明年过年了.由于项目中使用En ...

  4. Codeforces Round #647 (Div. 2) C. Johnny and Another Rating Drop(数学)

    题目链接:https://codeforces.com/contest/1362/problem/C 题意 计算从 $0$ 到 $n$ 相邻的数二进制下共有多少位不同,考虑二进制下的前导 $0$ .( ...

  5. 【noi 2.6_2421】Exchange Rates(DP)

    题意:起始有1000元美元,给出N天美元与加拿大元的汇率.问N天内可以不停的兑换,每次兑换需要收取3%的手续费,问可以得到的最大的美元数. 解法:直接用2个变量存第 i 天时手中是美元和加拿大元的最大 ...

  6. Codeforces 1144F Graph Without Long Directed Paths DFS染色

    题意: 输入一张有向图,无自回路和重边,判断能否将它变为有向图,使得图中任意一条路径长度都小于2. 如果可以,按照输入的边的顺序输出构造的每条边的方向,构造的边与输入的方向一致就输出1,否则输出0. ...

  7. 洛谷 P1629 邮递员送信-反向建边

    洛谷 P1629 邮递员送信 题目描述: 有一个邮递员要送东西,邮局在节点 11.他总共要送 n-1n−1 样东西,其目的地分别是节点 22 到节点 nn.由于这个城市的交通比较繁忙,因此所有的道路都 ...

  8. codeforces 876B

    B. Divisiblity of Differences time limit per test 1 second memory limit per test 512 megabytes input ...

  9. Bootstrap 中的 aria-label 和 aria-labelledby

    正常情况下,form表单的input组件都有对应的label.当input组件获取到焦点时,屏幕阅读器会读出相应的label里的文本. <form> <div class=" ...

  10. HDU 3065 病毒侵袭持续中(AC自动机 模板)题解

    题意:给出主串中每个模式串的个数 思路:毒瘤出题人多组数据没说给的是多组数据. 板子: struct Aho{ struct state{ int next[130]; int fail, cnt; ...