栈的实现

压入,弹出,查看栈的元素,以及栈是否为空

Posted by Ruizhi Ma on May 11, 2019

栈的底层实现

package stack;

public class MyStack {
	//用数组写栈的底层
	int[] elements;
	
	public MyStack(){
		elements = new int[0];
	}
	
	//往数组中压入元素
	public void push(int element){
		//创建一个新的数组
		int[] newArr = new int[elements.length + 1];
		
		//将原数组元素复制进新数组
		for(int i = 0;i < elements.length;i++){
			newArr[i] = elements[i];
		}
		
		//在新数组末尾添加新元素
		newArr[elements.length] = element;
		
		//将新数组赋值给原数组
		elements = newArr;
	}
	
	//从栈顶取元素
	public int pop(){
		//边界判定
		if(elements.length == 0){
			throw new RuntimeException("stack is empty!");
		}
		
		//创建一个新数组,比原数组长度小1
		int[] newArr = new int[elements.length - 1];
		
		//将原数组末尾元素取出
		int element = elements[elements.length - 1];
		
		//将原数组元素赋值给新数组
		for(int i = 0; i < newArr.length; i++){
			newArr[i] = elements[i];
		}
		
		//替换回原数组
		elements = newArr;
		
		return element; 
	}
	
	public int peek(){
		//边界判定
		if(elements.length == 0){
			throw new RuntimeException("stack is empty!");
		}
		return elements[elements.length - 1];
	}
	
	public boolean isEmpty(){
		return elements.length == 0;
	}
	
}

栈的测试类

package stackTest;

import stack.MyStack;

public class TestMyStack {

	public static void main(String[] args) {
		//创建一个栈
		MyStack ms = new MyStack();
		//压入数组
		ms.push(100);
		ms.push(99);
		ms.push(98);
		ms.push(97);
		
		//取出栈顶元素
		System.out.println(ms.pop());
		System.out.println(ms.pop());
		System.out.println(ms.pop());
		
		System.out.println("----------------");
		
		//查看栈顶元素
		System.out.println(ms.peek());
		
		System.out.println("----------------");
		
		System.out.println(ms.isEmpty());
		
	}

}

运行结果:
97
98
99
—————-
100
—————-
false

总结:用数组对栈的底层进行了实现。