在日常工作中,我们经常会需要用到集合,但是一个有一个必须要考虑的问题是,集合中的元素应该怎么置入和移除,stack和queue就是这个问题的描述,本文根据课程内容,给出了stack的两种实现方法。
基础知识回顾
stack
stack是常用的一种数据结构,简单来说,stack是一种后进先出的数据结构。通常包含如下几个方法:
pop: 移除stack最近增加的一个元素
push:增加一个元素到stack
isEmpy: 是否为空
size: 可选,返回包含的元素个数
代码实现
使用链表实现stack:
使用链表实现的stack,操作起来比较方便,但是每次都需要创建新的对象,开销比较大。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| package com.andy.stack;
public class LinkedStackOfString {
private Node first = null; private int size = 0;
private class Node{
String item; Node next; }
public boolean isEmpty(){ return size == 0; }
public String pop(){
String item = first.item; first = first.next; --size; return item; }
public void push(String item){
Node oldFirst = first; first = new Node(); first.item = item; first.next = oldFirst; ++size; }
public int size(){ return size; } }
|
使用数组实现stack
使用数组实现stack可以实现比较快速的置入和移除操作,但在数组尺寸不足是需要线性时间去扩充数组.同样的,当数组过大时,还需要限行时间去缩小数组,以节约空间.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package com.andy.stack;
import java.lang.reflect.Array;
public class ResizingArrayStackOfString {
private String[] s; private int N = 0;
public ResizingArrayStackOfString(){ s = new String[1]; }
public boolean isEmpty(){ return N == 0; }
public void push(String item){ if ( N == s.length ){ resize(s.length * 2); } s[N++] = item; }
public String pop(){ String item = s[N]; s[N] = null; N--; if ( N > 0 && N == s.length/4) resize(s.length/2); return item; }
public void resize(int capacity){ String[] copy = new String[capacity]; for( int i = 0; i < s.length; i++) copy[i] = s[i]; s = copy; }
}
|