项目一
编写程序,使用一维数组,模拟栈数据结构。
要求:
? 1、这个栈可以存java中的任何引用类型的数据。 ? 2、在栈中提供push方法模拟压栈。(栈满了,要有提示信息。) ? 3、在栈中提供pop方法模拟弹栈。(栈空了,也有有提示信息。 ? 4、编写测试程序,new栈对象,调用push pop方法来模拟压栈弹栈的动作。
知识回顾:
栈
栈是Vector的一个子类,它实现了一个标准的后进先出的栈,栈本身最重要的就是 push 和 pop。
堆栈只定义了默认构造函数,用来创建一个空栈。堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法
Stack()
除了由Vector定义的所有方法,自己也定义了一些方法:
序号 方法描述
1 boolean empty()
2 Object peek( )
3 Object pop( )
4 Object push(Object element)
5 int search(Object element)
用栈Stack 创建对象(类型不同)
Stack<Integer> stack = new Stack<>();
Stack<Character> stack = new Stack<>();
压栈:将元素放到栈里
弹栈:将元素从栈取出
栈帧(Stack Frame)
- 栈帧存在于 Java 虚拟机栈中,是 Java 虚拟机栈中的单位元素,每个线程中调用同一个方法或者不同的方法,都会创建不同的栈帧(可以简单理解为,一个线程调用一个方法创建一个栈帧),所以,调用的方法链越多,创建的栈帧越多(代表作:递归)。在 Running 的线程,只有当前栈帧有效(Java 虚拟机栈中栈顶的栈帧),与当前栈帧相关联的方法称为当前方法
- 每调用一个新的方法,被调用方法对应的栈帧就会被放到栈顶(入栈),也就是成为新的当前栈帧。当一个方法执行完成退出的时候,此方法对应的栈帧也相应销毁(出栈)。
- 栈帧结构如图:
代码
package com.guyuer.array.homework;
import java.util.SortedMap;
public class MyStack {
private Object[] elements;
private int index;
public MyStack() {
this.elements = new Object[10];
this.index = -1;
}
public void push(Object obj){
if(index >= this.elements.length-1){
System.out.println("栈已满,压栈失败!");
return;
}
this.elements[++index] = obj;
System.out.println("压栈"+obj+"元素成功,栈帧指向:"+index);
}
public Object pop(){
if(index < 0){
System.out.println("栈已空,弹栈失败!");
return null;
}
System.out.print("弹栈"+elements[index--]+"元素成功,");
System.out.println("栈帧指向"+index);
return null;
}
public Object[] getElements() {
return elements;
}
public void setElements(Object[] elements) {
this.elements = elements;
}
}
|