栈的实现(数组与链表实现)

栈(线性集合),后进先出(LIFO)方式进行处理,只在一端处理数据。
    push    添加一个元素到栈顶。
    pop     从栈顶移出一个元素
    peak    查看栈顶元素
package com.dengdi.arraystack;

public interface StackADT<T>{
    /**
     * 添加一个元素到栈顶部
     * @param element
     */
    public void push(T element);
    /**
     * 从栈顶移出一个元素
     * @return
     */
    public T pop();
    /**
     * 查看栈顶元素
     * @return
     */
    public T peek();
}
用数组来实现栈通过以下思想:
    (1)数组是一个对象引用的数组(其数据结构在栈实例化时确定);
    (2)栈底总是在数组的索引0处;
    (3)栈的元素是按顺序并连续存储在数组中;
    (4)整数变量top保存了紧跟栈顶元素后的数组引号。
package com.dengdi.arraystack;
/**
 * 用数组来实现栈的功能
 * @author dengdi
 *
 * @param <T>
 */
public class ArrayStack<T> implements StackADT<T>{
    private int DEFAULT_LENGTH=100;
    private int point;
    private T[] stack;

    public ArrayStack() {
        point=0;
        stack=(T[]) new Object[DEFAULT_LENGTH];//不能直接创建泛型数组
    }

    @Override
    public void push(T element) {
        stack[point]=element;
        point++;
    }

    @Override
    public T pop() {
        point--;
        T result=stack[point];
        stack[point]=null;
        return result;
    }

    @Override
    public T peek() {

        return stack[point-1];
    }   
}
    链表是一种链式结构,其中的一个对象可以指向另一个对象,从而在链表中创建一个对象的线性次序。在链表中存储的对象通常泛称为该链表的结点。
    注意:需要一个单独的引用变量来表示链表的首结点。链表终止于其next引用为空的结点。
    链式结构是一种数据结构,它使用对象引用变量来创建之间的链接。
package com.dengdi.arraystack;
//链表定义类
public class LinkedNode<T> {
    private LinkedNode<T> next;//链接下个对象
    private T element;
    public LinkedNode() {
        this.next=null;
        this.element=null;
    }
    public LinkedNode(T element) {
        this.next=null;
        this.element = element;
    }
    public LinkedNode<T> getNext() {
        return next;
    }
    public void setNext(LinkedNode<T> next) {
        this.next = next;
    }
    public T getElement() {
        return element;
    }
    public void setElement(T element) {
        this.element = element;
    }

}
    链表的插入结点:
        结点可以被插入到链表的任意位置:链表前端、内部结点之间或链表尾端。
        在链表前端添加结点时,需要重新设置向整个链表引用,新添加结点的next引用被设置为指向链表的当前的结点。接着,指向链表前端的引用重新设置为指向这个新添加结点。
package com.dengdi.arraystack;  
/**
 * 用链表实现栈
 * @author dengdi
 *
 * @param <T>
 */

public class LinkedStack<T> implements StackADT<T>{
    private int count;
    private LinkedNode<T> top;
    @Override
    public void push(T element) {
        LinkedNode<T> temp=new LinkedNode<T>(element);
        temp.setNext(top);
        top=temp;
        count++;
    }

    @Override
    public T pop() {
        T result=top.getElement();
        top=top.getNext();
        count--;
        return result;
    }

    @Override
    public T peek() {
        T result=top.getElement();
        return result;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值