java使用数组模拟栈(内容丰富)

将前面的所学的,自定义异常,异常处理,多态,等都有使用到

1.显示自己写的代码

(1).Stack代码

package stack;

//栈:后进先出

public class Stack {
	
	//使用数组存储数据
	//栈可以说存储多个引用类型的元素
	Try[] elements;
	int i=0;
	//栈默认的初始化容量是5
	//Constructor
	
	Stack(){
		this(5);
	}
	Stack(int max){
		elements = new Try[max];
	}
	
	//栈应该对外提供一个压栈的方法
	public void push(Try elemnt) {
		if(i==5)
		{
			System.out.println("栈已压满,无法压入");
		}else {
			//以下两句话可以合成一句话:elements[i++] = element;  i会先赋值再运算,所以在elements[i++] 时i++为零,代码执行完毕,i++w为1
		elements[i] = elemnt;
		i++;
		}
		
	}
	//栈应该对外提供一个弹栈的方法
	public Try pop() {  //不用传入参数,因为弹栈弹的是栈顶的元素
		Try o1;
		o1 = null;
		if(i==0) {
			System.out.println("栈内还无元素");
			return o1;
		}else
		{
		o1 = elements[i-1];
		i--;
		return o1;
		
		/*
		 * 以上考虑到的是弹栈时候实际上数组里的位置是i-1,所以想法是用个中间对象过渡下,但是实际上可以用下面一段话
		 * return elements[--i];
		 * */
		}
	}

}

(2).测试用代码

package stack;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Stack t1 = new Stack();
		Try n1 = new Try(1);
		Try n2 = new Try(2);
		Try n3 = new Try(3);
		Try n4 = new Try(4);
		Try n5 = new Try(5);
		Try n6 = new Try(6);
		t1.push(n1);
		t1.push(n1);
		t1.push(n3);
		t1.push(n5);
		t1.push(n5);
		 t1.pop().test();
		 t1.pop().test(); 
		
		
		//t1.push(n6);
		
		/*
		 * t1.pop().test(); t1.pop().test(); t1.pop().test(); t1.pop().test();
		 */
	}

}

 class Try {
		int i;
		public Try(int i){
			this.i = i;	
		}
		public void test() {
			System.out.println("这是第["+i+"]个类");
		}
}


2.在看了视频后总结之后,新的代码

(1).Stack代码

	package Stack2;

/*Stack1里面是在看完讲解视频之前写的,讲解视频为B站动力节点,java进阶,模拟栈视频
 * Stack1里主要缺少以下内容:
 * 1 .多态应用观念不深刻(万物皆继承与Object类),所以在Stack类里都可以用Object类来定义,外部压入的可以是任何一个测试类,因为任何测试类都是继承与Object类的
 * 在Stack1里面我把Stack里面所有的Object类定义改为新写的Try类,这不是必须的,Try类也是继承与Object类,所以一个入口为Object类,Try类也能放进去
 * 
 * 2. 异常处理机制未使用(异常处理机制的平抛,try..catch..使用)。首先在Stack1虽然意识到了栈里面的两个会发生异常的地方,第一是在压栈时候,当栈满了将无法压入。
 * 第二是弹栈的时候,当栈内没有元素的时候,将无法弹出。虽然也加了判断语句去规避,但是没有运用到异常机制去处理,同时可以发现在弹栈的时候,即使加了判断语句
 * 但是依然需要弹出元素的,所以最后弹出了null
 * 同时注意在throw之后,在方法位置和还需要throws上抛异常
 * 
 * 3. toString方法的应用场景(对toString的应用场景了解不充分),注意:system.out.println(类名),当该类为空的时候,通过syso源码可以输出"null",如果不是空,是指向
 * 一个具体的对象,那么输出该对象的toString方法(所有类都是继承与Object类,toString方法是Object类的),同时对toString方法进行重写。不重写输出的是“包名+哈希(地址)”
 * 
 * 4.自定义异常的写法(自定义异常的写法使用不熟练)自定义异常与异常的平抛使用,联系到printStackTrace()方法。同时回顾前面的知识,自定义异常类型和系统指定异常类型
 * 两者之间,虽然一个对象是自己创建,一个对象是系统默认创建的,但是都是对创建出来对象进行处理。
 * 
 *
 * 5 .语法不简洁,在Stakc1里面有对一些不简洁代码的注释,例如 i++ 和--i的应用。
 * 
 * 
 * 
 * */

public class Stack {
	Object[] elements;
	int index;
	
	public  Stack()
	{
		this(5);
	}
	public  Stack(int max)
	{
		elements = new Object[max];
	}
	//压栈方法
	public void push(Object element) throws StackOutofException
	{
		//当栈满时候
		if(index == elements.length)
		{
			throw new StackOutofException("已栈满,无法压入");
		}
		//先赋值在自加
		elements[index++] = element;
		}

	public Object pop() throws StackOutofException {
		
		if(index == 0)
		{
			StackOutofException e = new StackOutofException("栈一空无法弹栈");
			throw e;
		}
		//先自减后再赋值
		return elements[--index];
	}

}

(2).自定义异常代码

package Stack2;
public class StackOutException{
	
}

class StackOutofException extends Exception {
		/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
		public StackOutofException(){
			
		}
		public StackOutofException(String s) {
			super(s);
		}
}

(3).测试代码

package Stack2;

public class Test {

	public static void main(String[] args) throws StackOutofException{
		// TODO Auto-generated method stub
		Stack s1 = new Stack();
		Try n1 = new Try(1);
		Try n2 = new Try(2);
		Try n3 = new Try(3);
		Try n4 = new Try(4);
		Try n5 = new Try(5);
		
		
		try { 
		s1.push(n1);
		s1.push(n2);
		s1.push(n3);
		s1.push(n4);
		s1.push(n5);
		s1.push(n5);
		}catch(StackOutofException e)
		{
			e.printStackTrace();
		}
		
		
		try {
		System.out.println(s1.pop());
		System.out.println(s1.pop());
		System.out.println(s1.pop());
		System.out.println(s1.pop());
		System.out.println(s1.pop());
		System.out.println(s1.pop());

		
		}catch(StackOutofException e)
		{
			String e1 = e.getMessage();
			System.out.println(e1);
		}
		s1.push(n5);
		System.out.println(s1.pop());
	}
	
	
}

class Try{
	int no;
	
	public Try(int no)
	{
		this.no = no;
	}
	public String toString() 
	{
		return "这是第"+no+"个压入的";
	}
	
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值