- 基本讲解
- 可以把栈理解成一个放那种很大很重的书的箱子,每本书的长宽和箱子的尺寸一样,每当向这个箱子放书的时候,第一本是放到最底下的,然后依次往上放,每次取书的时候,都是从上往下取的,这也就是“先进后出”。
- 算法的基本原理
- 就是用一个Object数组来充当栈的内容,再定义栈顶指针,一个栈底指针。每次压栈的时候就元素放到数组[栈顶指针]的位置,每次出栈的时候就把数组[栈顶指针]的值弹出来就可以了
- 代码
package learning.stark; import java.util.LinkedList; import java.util.List; public class StarkTest { public static void main(String []args){ StarkTest starkTest = new StarkTest(); Stark stark = starkTest.initStark(); stark = starkTest.pushSatrk(stark, 3); stark = starkTest.pushSatrk(stark, "23"); List<Object> result = starkTest.popStark(stark); System.out.println(result.get(1)); result = starkTest.popStark((Stark) result.get(0)); System.out.println(result.get(1)); } private Stark initStark(){ Object []starkContent = new Object[5]; int bottom = 0; int top = 0; return new Stark(starkContent,top, bottom); } private Stark pushSatrk(Stark stark, Object ele){ Object []starkContent = stark.getContent(); int top = stark.getTop(); starkContent[top] = ele; top = top + 1; int bottom = stark.getBottom(); return new Stark(starkContent, top , bottom); } private List<Object> popStark(Stark stark){ Object []starkContent = stark.getContent(); int top = stark.getTop(); top = top - 1; int bottom = stark.getBottom(); List<Object> result = new LinkedList<Object>(); result.add(new Stark(starkContent, top, bottom)); result.add(starkContent[top]); return result; } }
-
优化版,去掉了显示声明的栈顶指针和栈底指针,取而代之的是使用新的数组代替原来的数组(新的数组的长度比原来的数组长度加一或者减一来模拟栈顶指针的移动)
package learning.stark; /** * 算法: * 1、声明了一个数组成员变量,然后通过操作这个成员变量来实现栈的相关的操作 * 2、压栈: 用一个比原来数组长度多一的数组代替原来的数组,并且把最后一个元素设置为压栈的值 * 3、弹出:将数组的最后一个元素返回,并且将数组的长度减一 * 4、查看元素:返回数组的最后最后一个元素 * 4、判空: 判断数组的长度是否为0 */ public class StarkByTeacher { private int []elements = new int[0]; public void push(int ele){ int[] newArray = new int[elements.length + 1]; for(int i = 0; i < elements.length; i++ ){ newArray[i] = elements[i]; } elements = newArray; elements[elements.length - 1] = ele; } public int pop(){ if(elements.length == 0){ throw new RuntimeException("stark is empty"); } int result = elements[elements.length -1]; int newArr[] = new int[elements.length -1]; for(int i=0; i< newArr.length; i++){ newArr[i] = elements[i]; } elements = newArr; return result; } public int peek(){ if(elements.length == 0){ throw new RuntimeException("stark is empty"); } return elements[elements.length - 1]; } public boolean isEmpty(){ return elements.length == 0; } }