数组实现栈和队列

数组栈:


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;
    }

    public Integer peek() {
        if(index == 0) {
            return null;
        }
        return arr[index - 1];
    }

    public void push(int obj) {
        if(index == arr.length) {
            throw new ArrayIndexOutOfBoundsException("this stack is full");
        }
        arr[index++] = obj;
    }
    public Integer pop() {
        if(index == 0) {
            throw new ArrayIndexOutOfBoundsException("this stack is empty");
        }
        return arr[--index];
    }
    public static void main(String[] args) {
        ArrayStack stack = new ArrayStack(5);
        stack.push(5);
        stack.push(3);
        System.out.println(stack.pop());
        stack.pop();
        System.out.println(stack.peek());

    }

}

运行结果:

数组队列:


public class ArrayQueue {
    private Integer[] arr;
    private Integer size;
    private Integer first;
    private Integer last;

    public ArrayQueue(int initSize) {
        if(initSize == 0) {
            throw new IllegalArgumentException("this is queue is less than 0");
        }
        arr = new Integer[initSize];
        size = 0;
        first = 0;
        last = 0;
    }

    public Integer peek() {
        if(size == 0) {
            return null;
        }
        return arr[first];
    }

    public void push(int obj) {
        if(size == arr.length) {
            throw new ArrayIndexOutOfBoundsException("this queue is full");
        }
        size++;
        arr[last] = obj;
        last = last == arr.length - 1 ? 0 : last + 1;
    }

    public Integer poll() {
        if(size == 0) {
            throw new ArrayIndexOutOfBoundsException("this queue is empty");
        }
        size--;
        int tmp = first;
        first = first == arr.length - 1 ? 0 : first + 1;
        return arr[tmp];
    }
    public static void main(String[] args) {
        ArrayQueue queue = new ArrayQueue(5);
        queue.push(4);
        queue.push(6);
        System.out.println(queue.poll());
        System.out.println(queue.peek());
    }

}

运行结果:

取栈中最小元素:实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作getMin。要求如下:

pop、push、getMin操作的时间复杂度都是O(1)。
设计的栈类型可以使用现成的栈结构。
思路:使用两个栈,stack2栈顶元素维持stack1中最小元素的值,当入栈的元素小于stack2栈顶元素时直接入satck2,否则取栈顶元素的值再入satck2.
import java.util.Stack;

public class work3 {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    public work3() {
        this.stack1 = new Stack<Integer>();
        this.stack2 = new Stack<Integer>();
    }
    public void push(int num) {
        if(this.stack2.isEmpty()) {
            this.stack2.push(num);
        }else if(num < this.getMin()) {
            this.stack2.push(num);
        }else {
            int newNum = this.stack2.peek();
            this.stack2.push(newNum);
        }
        this.stack1.push(num);
    }
    public int pop() {
        if(this.stack1.isEmpty()) {
            throw new RuntimeException("You stack is empty.");
        }
        this.stack2.pop();
        return this.stack1.pop();
    }
    public int getMin() {
        if(this.stack2.isEmpty()) {
            throw new RuntimeException("You stack is empty.");
        }
            return this.stack2.peek();
    }
    public static void main(String[] args) {
        work3 stack = new work3();
        stack.push(5);
        System.out.println(stack.getMin());
        stack.push(1);
        System.out.println(stack.getMin());
        stack.pop();
        stack.push(2);
        System.out.println(stack.getMin());
    }

}

运行结果:

原文地址:https://blog.51cto.com/14472348/2480746

时间: 2024-10-16 11:56:55

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

JavaScript数组模拟栈和队列

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

Javascript用数组实现栈和队列

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

用数组实现栈和队列

本篇文章是模拟LinkedList实现其中的:添加,取值,入队,出队,入栈,出栈 1.动态数组的实现 package com.sxt.test.java; public class Array { protected Object[] arrays = new Object[0]; protected Object[] arrays2=null; //每增加一个元素,就新建一个比原来长度+1的数组, //把原来数组的数据都放入新的数组,最后把新加的数据添到最后 //原数组置空 public vo

【自考】数据结构第三章,栈、队列、数组,期末不挂科指南,第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;