java栈和列队

来源:互联网 发布:何新 知乎 编辑:程序博客网 时间:2024/06/07 01:11

1:栈的构造和应用

栈的特点:先进后出,后进先出。

代码:

package CH03;

public class Mystack {
    //底层实现是一个数组
    private long[] arr;
    private int top;//top表示栈顶
//    默认的构造方法
    public Mystack() {
        // TODO Auto-generated constructor stub
        arr = new long[10];//初始化数组
        top=-1;//因为初始化的时候栈顶是没有任何出口的
    }
//    带参数的构造方法,参数为数组化初始化大小
    public Mystack(int MaxSize){
        arr=new long[MaxSize];
        top=-1;
    }
//    添加数据
    public void push(int value){
        arr[++top]=value;
        //首先对top进行一个递增,开始为-1,现在为0,也就是arr[0]=value,第二次添加就是arr[1]=value    
    }
//    移除数据
    public long pop(){
        return arr[top--];
    }
//    查看数据
    public long peek(){
        return arr[top];
    }
//    判断是否为空
    public boolean isEmpty(){
        return top==-1;//为-1是为空的
    }
//    判断是够栈满
    public boolean isFull(){
        //是否满的就看top是否等于数组的长度,减1是因为top是从0开始的
        return top==arr.length-1;
    }
}

===========

测试代码

package CH03;

public class TestStack {
    public static void main(String[] args) {
        Mystack mystack = new Mystack(4);
        mystack.push(23);//插入数据
        mystack.push(12);
        mystack.push(40);
        mystack.push(20);
        //判断是够为空,判断是够栈满
        System.out.println(mystack.isEmpty());
        System.out.println(mystack.isFull());
        //第一个返回false,第二个返回true
        //查看栈顶
        System.err.println(mystack.peek());//打印出20
        while(!mystack.isEmpty()){
            //打印出移除数据,20,40,12,23,这个和我加入进来的数据正好是相反的
            System.out.print(mystack.pop()+" ");
        }
        //判断是够为空,判断是够栈满
                System.out.println(mystack.isEmpty());
                System.out.println(mystack.isFull());
    }
}




2:列队的构造和应用

列队和栈完完全全不同的

顺序:

先进先出,后进后出,就像现实生活中的买票例子

package CH03;

public class Myqueue {
    //底层是使用数组
    private long[] arr;
//    有效数据的大小
    private int elements;
//    对头
    private int front;
//    队尾
    private int end;
//    默认的构造方法
    public Myqueue() {
        // TODO Auto-generated constructor stub
//        初始化大小为10
        arr = new long[10];
        elements=0;
        front=0;
        end=-1;
    }
//    带参数的构造方法,参数为数组的大小
    public Myqueue(int maxSzie){
        arr = new long[maxSzie];
        elements=0;
        front=0;
        end=-1;
    }
//    添加数据,从队尾插入
    public void insert(long value){
        arr[++end]=value;
        elements++;//有效数据也要递增
    }
//    删除数据,从对头删除
    public long remove(){
        elements--;
        return arr[front++];
    }
//    查看数据,从队头查看
    public long peek(){
        return arr[front];
    }
//    判断是否为空
    public boolean isEmpty(){
        
        return elements==0;
    }
//    判断是否满了
    public boolean isFull(){
        return elements==arr.length;
    }
}

========

测试

package CH03;

public class TestQueue {
    public static void main(String[] args) {
        Myqueue mq = new Myqueue(4);
        mq.insert(23);
        mq.insert(3);
        mq.insert(34);
        mq.insert(90);
        //判断是为空还是满
        System.out.println(mq.isEmpty());
        System.out.println(mq.isFull());
        //查看数据,是23,队头
        System.out.println(mq.peek());
        while(!mq.isEmpty()){
            System.out.print(mq.remove()+" ");
        }
        //判断是为空还是满
        System.out.println(mq.isEmpty());
        System.out.println(mq.isFull());
    }
}
问题:如果再插入数据,就会出现数组越界的问题,用循环数组可以解决这个问题

==========

在这些代码改动

添加数据,从队尾插入
    public void insert(long value){
        if(end==arr.length-1){//当前end指向数组的最后一个元素
            end=-1;
        }
        arr[++end]=value;
        elements++;//有效数据也要递增
    }
//    删除数据,从对头删除
    public long remove(){
        long value=arr[front++];//首先取得删除的数组

        if(front==arr.length){//再判断front如果到了最后面的时候
            front=0;
        }
        elements--;
        return value;
    }

//============



0 0
原创粉丝点击