[算法]如何实现栈

如何实现栈


采用数组和链表两种方式来实现栈

数组实现栈,代码如下:

package 如何实现栈;

import java.util.Arrays;

public class MyStack<E> {

    private Object[] stack;
    private int size;   //数组中存储的个数
    public MyStack(){
        stack = new Object[10];   //初始长度为10
    }
    //判断堆栈是否为空
    public boolean isEmpty(){
        return size == 0;
    }

    //获取头元素
    public E peek(){
        if(isEmpty()){
            return null;
        }
        return (E) stack[size - 1];
    }

    //弹出元素
    public E pop(){
        E e = peek();
        stack[size - 1] = null;
        size--;
        return e;
    }

    //压入元素
    public E push(E item){
        ensureCapacity(size + 1);
        stack[size++] = item;
        return item;
    }

    //判断数组容器是否已满,若已满,则扩充数组空间
    private void ensureCapacity(int size){
        int len = stack.length;
        if(size > len){    //数组已满
            int newLen = 10; //每次数组扩充的容量
            stack = Arrays.copyOf(stack, newLen);
        }
    }

    public static void main(String[] args) {
        MyStack<Integer> s = new MyStack<>();
        s.push(1);
        s.push(2);
        System.out.println("栈中元素个数:"+ s.size);
        System.out.println("栈顶元素为:" + s.pop());
        System.out.println("栈顶元素为:" + s.pop());
    }
}

链表的方式实现栈,代码如下:

public class Node<E> {

    Node<E> next = null;
    E data;
    public Node(E data){
        this.data = data;
    }
}

package 如何实现栈;
/**
 * 用链表方式实现栈
 * @author dream
 *
 * @param <E>
 */
public class MyStack2<E> {

    Node<E> top = null;

    public boolean isEmpty(){
        return top == null;
    }

    public void push(E data){
        Node<E> newNode = new Node<E>(data);
        newNode.next = top;
        top = newNode;
    }

    public E pop(){
        if(isEmpty()){
            return null;
        }
        E data = top.data;
        top = top.next;
        return data;
    }

    public E peek(){
        if(isEmpty()){
            return null;
        }
        return top.data;
    }
}
时间: 2024-10-31 03:49:41

[算法]如何实现栈的相关文章

[算法]求栈中最小元素

如何用O(1)的时间复杂度求栈中最小元素 解题思路: 我们经常会采用空间换取时间提高时间复杂度.我们可以使用两个栈结构,一个栈用来存储数据,另一个栈用来存储栈中的最小元素.思路如下:如果当前入栈的元素比原来栈中的最小值还小,则把这个值压入保存最小元素的栈中:在出栈时,如果当前入栈的元素恰好为当前栈中的最小值,保存最小值的栈顶元素也出栈,使得当前最小值变为其入栈之前的那个最小值. 实现代码如下: package 求栈中最小元素; /** * 用链表方式实现栈 * @author dream * *

[算法]区间重合判断

题目描述: 给定一个源区间 [x,y]和N个无序的目标区间[x1,y1],[x2,y2],...[xn,y,],判断给定的源区间[x,y]在不在目标区间内. 例如:给定源区间[1 6]和目标区间[1 2][2 4][4 9]即可认为区间[1 6]在目标区间内,因为源区间的并集为[1 9 ]. 试想一下,现在在这样的一个目标区间的集合, 需要频繁地去查询一个区间是否在该集合中.那么怎么样才能降低单次查询的复 杂度呢.预处理.对区间的预处理可以满足这样的需求. 直接上方法: 第一步: 首先对区间进行

[算法]区间重合推断

题目描写叙述: 给定一个源区间 [x,y]和N个无序的目标区间[x1,y1],[x2,y2],...[xn,y,],推断给定的源区间[x,y]在不在目标区间内. 比如:给定源区间[1 6]和目标区间[1 2][2 4][4 9]就可以觉得区间[1 6]在目标区间内,由于源区间的并集为[1 9 ]. 试想一下,如今在这种一个目标区间的集合. 须要频繁地去查询一个区间是否在该集合中.那么怎么样才干减少单次查询的复 杂度呢.预处理.对区间的预处理能够满足这种需求. 直接上方法: 第一步: 首先对区间进

[算法]删除字符串中重复的字符

如何删除字符串中重复的字符 问题描述: 删除字符串中重复的字符,例如,"good"去掉重复的字符串后就变成"god". 第一种方法: "蛮力法",最简单的方法就是把这个字符串看作是一个字符数组,对该数组使用双重循环进行遍历,如果发现有重复的字符,就把该字符置为'\0',最后再把这个字符数组中所有的'\0'去掉,此时得到的字符串就是删除重复字符后的目标字符串. 代码如下: package 删除字符串中重复的字符; public class Solu

[算法]找出单链表中的倒数第k个元素

找出单链表中的倒数第k个元素 解题思路: 为了求出链表中的倒数第k个元素,最容易想到的方法是首先遍历一遍单链表,求出整个单链表的长度n,然后将倒数第k个,转换为正数第n-k个,接下去遍历一次就可以得到结果.不过这种方法需要对链表进行两次遍历,第一次遍历用于求解单链表的长度,第二次遍历用于查找正数第n-k个元素. 如果沿从头至尾的方向从链表中的某个元素开始,遍历k个元素刚好到达链表尾,那么元素就是要找的倒数第k个元素.设计如下:依次对链表的每一个结点元素进行这样的测试,遍历k个元素,查看是否到达链

[算法]年终奖

[转载:http://blog.csdn.net/codeemperor/article/details/51068478] 小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物. 给定一个6*6的矩阵board,其中每个元素为对应格

[算法]判断两个字符串是否由相同的字符组成

如何判断两个字符串是否由相同的字符组成 题目描述: 由相同的字符组成是指组成两个字符串的字母以及各个字母的个数是一样的,只是排列顺序不同而已.例如"aaaabbc"与"abcbaaa"就由相同的字符组成的. 方法一: 排序法,将两个字符串中的字符排序,比较两个排序后的字符串是否相等.若相等则表明它们是由相同的字符组成的,否则,表明他们是由不同的字符组成的. import java.util.Arrays; public class Solution { public

[算法]实现单链表的反转

实现链表的反转 解题思路: 为了正确反转一个链表,需要调整指针的指向.举例说明,例如i,m,n是三个相邻的结点,假设经过若干步操作,已经把结点i之前的指针调整完毕,这些结点的next指针都指向前面一个结点.现在遍历到结点m,当然需要调整结点的next指针,让它指向结点i,但需要注意的是,一旦调整了指针的指向,链表就断开了,因为已经没有指针指向结点n,没有办法再遍历到结点n了,所以为了避免指针断开,需要在调整m的next之前要把n保存下来.接下来试着找到反转后链表的头结点.不难分析出翻转后链表的头

[ufldl]Supervised Neural Networks

要实现的部分为:forward prop, softmax函数的cost function,每一层的gradient,以及penalty cost和gradient. forwad prop forward prop是输入sample data,使sample data通过神经网络后得到神经网络输出的过程. 以分类问题来说,不同层的输入和输出如下表所示: 层 输入 输出 输入层 sample data feature map 隐藏层 feature map feature map 输出层 fea