int[] a=null//声明数组,也是引用
a=new int[5]//分配内存地址。
好了,数组的引用,也就是a,当你在声明的时候,他会在栈中开辟一个地址空间。也就是第一步
第二步的作用,是在堆中开辟一系统连续的地址,具体的需要根据你的类型还有数组长度。
总结下,也是,数组的引用保存在栈中,同时实例的时候在堆中开辟连续空间,栈中的空间指向堆的首地址。
再稍微说明一下,为什么我们平常说不new不可以对数组进行操作呢??因为此时堆中没有分配内存地址。所以你的数据没有地方存放和操作。
public class Stack {private Object[] stack
//这个不需要
//private int top = 0//初始化栈顶
//这个也不需要
//写一个栈出来,最好是可以动态的,可以自己改变大小的,即数组的长度
//private int size = 0// 初始化大小
//元素个数
private int size
//默认长度为10
public Stack(){
this(10)
}
//也可以自己设置长度,即容量
public Stack(int len){
stack = new Object[len]
}
//返回元素个数
public int size(){
return size
}
//返回数组长度,即容量
public int capacity(){
return stack.length
}
//实现动态的数组
public void ensureCapacity(){
if(size() == capacity()){
Object[] newStack = new Object[size() * 3 / 2 + 1]
System.arraycopy(stack, 0, newStack, 0, size())
stack = newStack
}
}
//入栈
public void push(Object o){
size++
ensureCapacity()
stack[size - 1] = o
}
/*
public void push(Object object) {
if (isFull()) {
System.out.println("栈满! 入栈失败")
}
stack[top++] = object
}
*/
//判空
public boolean isEmpty(){
return size == 0
}
//出栈
public Object pop(){
//首先要判空
if(isEmpty()){
throw new ArrayIndexOutOfBoundsException("不能为空")
}
Object o = stack[--size]
stack[size] = null
return o
}
/*
// 出栈
public Object pop() {
Object object = stack[--top]
stack[top] = null
return object
}
*/
/*
// 计算栈当前大小
public int size() {
return top
}
// 判断是否是空栈
public boolean isEmpey() {
return top == 0
}
// 判断是否栈满
public boolean isFull() {
return top >= size
}
public Stack(int size) {
this.size = size
}
*/
public static void main(String[] args) {
Stack stack = new Stack(3)
String[] data = new String[] { "a", "b", "c" }
for (int i = 0i <data.lengthi++) {
stack.push(data[i])
System.out.println(data[i] + "")
}
System.out.println("***********")
while (!stack.isEmpty()) {
System.out.println(stack.pop() + "")
}
//}
}
}
你自己对比一下,我是在你的里面修改的
Java栈的实现public class MyStack { //定义一个堆栈类
int[] array//用int数组来保存数据,根据需要可以换类型
int s_size //定义堆栈的宽度
public MyStack(int i){//定义一个带参数构造器
array=new int[i]//动态定义数组的长度
s_size=0//堆栈的默认宽度为0
}
public MyStack(){ //默认构造器
this(50)//默认构造器可容纳50个元素
}
public void push(int i){ //压栈
array[this.s_size]=i
this.s_size++
}
public int pop(){ //从堆栈中取元素,从栈顶开始取
if(this.s_size!=0){
int t=array[s_size-1] //用中间变量保存栈顶的元素
array[s_size-1]=0 //取完元素该位置设为0
s_size-- //栈的大小减1
return t//返回栈顶元素
}else{
System.out.println("This stack is empty") //当栈为空时显示提示信息,返回0
return 0
}
}
public boolean isEmpty(){ //判断栈是否为空
return this.s_size==0
}
public int top(){ //从栈顶取值,功能和 pop() 方法一样
if(!this.isEmpty()){
int t=array[this.s_size-1]
array[this.s_size-1]=0
this.s_size--
return t
}else{
System.out.println("This stack is empty!")
return 0
}
}
public void printAll(){ //打印出堆栈中的所有元素的值,不是取出,元素依然在堆栈里
if(!this.isEmpty()){
for(int i=this.s_size - 1i>=0i--){
System.out.println(array[i])
}
}
}
//下面是测试代码
public static void main(String[] args){
MyStack stack=new MyStack()
stack.push(4)
stack.push(5)
stack.push(6)
stack.push(7)
//System.out.println(stack.isEmpty())
stack.printAll()
System.out.println("===========")
System.out.println(stack.top())
System.out.println(stack.top())
System.out.println(stack.top())
System.out.println(stack.top())
System.out.println(stack.top())
}
}