用数组实现栈和队列

本篇文章是模拟LinkedList实现其中的:添加,取值,入队,出队,入栈,出栈

1.动态数组的实现

package com.sxt.test.java;

public class Array {
    protected Object[] arrays = new Object[0];
    protected Object[] arrays2=null;
    //每增加一个元素,就新建一个比原来长度+1的数组,   //把原来数组的数据都放入新的数组,最后把新加的数据添到最后  //原数组置空
    public void add(Object o) {
        if(arrays!=null && arrays2==null) {
            arrays2 = new Object[arrays.length+1];
            for(int i=0;i<arrays.length;i++) {
                arrays2[i] = arrays[i];
            }
            arrays2[arrays.length] = o;
            arrays = null;
            return;
        }

        if(arrays==null && arrays2!=null) {
            arrays = new Object[arrays2.length+1];
            for(int i=0;i<arrays2.length;i++) {
                arrays[i] = arrays2[i];
            }
            arrays[arrays2.length] = o;
            arrays2 = null;
            return;
        }

    }
    //取数据时,两个数组必定有一个为空,一个有数据
    public Object get(int index) {
        Object o = null;
        try {
            if(arrays!=null) {
                o = arrays[index];
            }
            if(arrays2!=null) {
                o = arrays[index];
            }
        }catch(Exception e) {
            throw new RuntimeException("出错了..",e);
        }
        return o;
    }
    public int length() {
        int length = 0;
        if(arrays!=null) {
            length = arrays.length;
        }else
        if(arrays2!=null) {
            length = arrays2.length;
        }
        return length;
    }
}

2.队列的实现

package com.sxt.test.java;

public class Queue extends Array{

    /**
     * 入队
     * */
    public void add(Object o) {
        super.add(o);
    }
    /**
     * 出队   * 两个数组必定一个有数据,一个为空   * 取出第一个数据,然后新建一个比原来长度-1的数组     * 从后往前,把数据放入新数组里,原先的第一个数据就没有放进去    * 最后把取出的第一个数据返回
     * */
    public Object poll() {
        Object o = null;
        if(arrays!=null) {
            o = arrays[0];
            arrays2 = new Object[arrays.length-1];
            for(int i=arrays.length-1;i>0;i--) {
                arrays2[i-1]=arrays[i];
            }
            arrays = null;

        }else if(arrays2!=null) {
            o = arrays2[0];
            arrays = new Object[arrays2.length-1];
            for(int i=arrays2.length-1;i>0;i--) {
                arrays[i-1]=arrays2[i];
            }
            arrays2 = null;
        }
        return o;
    }

}

3.栈的实现

package com.sxt.test.java;

public class Stack extends Array{

    /**
     * 压栈
     * */
    public void push(Object o) {
        super.add(o);
    }

    /**
     * 出栈     * 取数组的最后一个数据返回     * 然后新建一个比原来长度-1的数组,从前往后把数据放入新数组,最后一个数据就没有放入     *     * 最后把取出的最后一个数据返回
     * */
    public Object pop() {
        Object o = null;
        if(arrays!=null) {
            o = arrays[arrays.length-1];
            arrays2 = new Object[arrays.length-1];
            for(int i=0; i<arrays.length-1; i++) {
                arrays2[i] = arrays[i];
            }
            arrays = null;

        }else if(arrays2!=null) {
            o = arrays2[arrays2.length-1];
            arrays = new Object[arrays2.length-1];
            for(int i=0; i<arrays2.length-1; i++) {
                arrays[i] = arrays2[i];
            }
            arrays2 = null;
        }
        return o;
    }
}

4.测试类

/**
         * 动态数组 Array测试
         * */
        Array a = new Array();
        a.add("a");
        a.add("b");
        a.add("c");
        a.add("d");

        System.out.println(a.length());
        for(int i=0;i<a.length();i++) {
            System.out.println(a.get(i));
        }
        System.out.println("------------");

        /**
         * Queue测试
         *     */
        Queue queue= new Queue() ;
        queue.add("a");
        queue.add("b");
        queue.add("c");
        queue.add("d");
        queue.add("e");
        queue.add("f");

        System.out.println(queue.length());
        while(queue.length()>0) {
            System.out.println(queue.poll());
        }
        System.out.println("----------");

        /**
         * 栈测试
         * */
        Stack stack = new Stack();
        stack.push("a");
        stack.push("b");
        stack.push("c");
        stack.push("d");
        stack.push("e");
        stack.push("f");
        System.out.println(stack.length());
        while(stack.length()>0) {
            System.out.println(stack.pop());
        }
时间: 2024-08-02 06:58:46

用数组实现栈和队列的相关文章

JavaScript数组模拟栈和队列

*栈和队列:js中没有真正的栈和队列的类型              一切都是用数组对象模拟的 栈:只能从一端进出的数组,另一端封闭       FILO   何时使用:今后只要仅希望数组只能从一端进出时   如何使用:2种情况:     1. 末尾出入栈:已入栈元素的下标不再改变        入栈: arr.push(新值1,...)        出站: var last=arr.pop() 2. 开头出入栈:每次入栈新元素时,已入栈元素的位置都会向后顺移.        入栈:arr.u

Javascript用数组实现栈和队列

栈是遵循后进先出(LIFO)规则的一种有序集合,比如桌上的一叠书,我们只能从上面放或取. 队列是遵循先进先出(FIFO)规则的一种有序集合,比如排队,先排到的先离开. 数组也是一种有序的集合,它与上面两种数据结构类似.由于JavaScript中的数组本身拥有许多简单的方法,如push(), 所以用数组来表示栈和队列非常简单. 首先回顾一下相关的方法: push():向数组尾部添加一个或多个项. pop():删除数组尾部的一个项. unshift():先数组头部添加一个或多个项. shift():

数组实现栈和队列

数组栈: public class ArrayStack { private Integer[] arr; private Integer index; public ArrayStack(int initSize) { if(initSize < 0) { throw new IllegalArgumentException("this init size is less than 0"); } arr = new Integer[initSize]; index = 0; }

【自考】数据结构第三章,栈、队列、数组,期末不挂科指南,第3篇

学习目标 自考重点.期末考试必过指南,这篇文章让你理解什么是栈.什么是队列.什么是数组 掌握栈.队列的顺序存储结构和链式存储结构 掌握栈.队列的基本操作在顺序存储结构和链式存储结构上的实现 掌握矩阵的压缩存储 今天核心咱们先把栈搞清楚 栈和队列可以看做是特殊的线性表 .它们的特殊性表现在它们的基本运算是线性表运算的子集,它们是运算受限的线性表 栈 栈(Stack)是运算受限的线性表,这种线性表上的插入和删除操作限定在表的一端进行 基本概念 栈顶:允许插入和删除的一端 栈尾:另一端 空栈:不含任何

实现特殊的栈和队列

利用一个固定数组实现栈和队列 class ArrayStack //用数组实现栈 { public: ArrayStack(int initsize) //创建一个固定长度的数组 { if (initsize < 0) { cout << "数组长度小于0" << endl; } else { array = vector<int>(initsize - 1); size = 0; } } void push(int obj) { if (si

快速记忆数组栈和队列函数push()和shift()

在js中,对数组的操作是比较常见的,有时候,我们需要模拟栈和队列的特性才能实现需求,今天来给大家用通俗易懂.简洁明了的几行文字,来告诉大家栈和队列的几个函数,如何快速记住. 首先,概念还是要知道的: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻

数组拷贝、数组函数、通过数组函数来模拟数据结构的栈和队列、回调的意义、数组函数的排序问题、算法以及寻找素数的筛选法

1.数组的拷贝数组拷贝时指针的指向问题. 数组在拷贝时,指针的位置随之复制[这一点拷贝是完全一样]但是如果拷贝的数组的指针是非法的,那么拷贝出新指针的位置进行初始化<?php$arr1=array('123');end($arr1);next($arr1);//这个指针非法$arr2 = $arr1;//这里进行数组的拷贝var_dump(current($arr2));//得到指向‘123’元素的指针var_dump(current($arr1));//此时这个数组的指针有问题?> 但是拷贝

JavaScript高级程序设计--对象,数组(栈方法,队列方法,重排序方法,迭代方法)

1.使用对象字面量定义对象 var person={}; 使用这种方式创建对象时,实际上不会调用Object构造函数. 开发人员更喜欢对象字面量的语法. 2.有时候需要传递大量可选参数的情形时,一般来讲使用对象字面量来封装多个可选参数. 3.对象属性的点表示法与方括号表示法的区别 (1)功能上:两者没区别 (2)但是方括号的有点是可以通过变量来访问属性 例如: var person={ name:"Nic" } 点表示法:person.name 方括号表示法:var prop=“nam

分别用数组和链表实现栈和队列

2015.2.8星期二,晴天 栈的数组操作: 栈的特点:先进后出,后进先出. 用数组的方式实现:首先需要创建一个结构体,在结构体里面包括数据指针.指向栈顶的”指针“和标记栈的大小的一个变量.数据指针是指向一定大小的数组的首地址.结构体和这个数组够成一个完整的栈. 1.在创建栈的操作中,主要就是创建这个结构体和这个数组,并对其进行一定的初始化,这个操作和链表的创建比较类似,初始化的语句:stack->max_depth = max_depth; //说明栈的大小stack->pop = -1;