仿写一下Stack,还有些问题,之后再改进
栈是用来存储逻辑关系为 “一对一” 数据的线性存储结构。
栈的特性:先进后出,只能从栈顶弹出元素,添加元素称为压栈
需求分析:
所需属性:栈顶指针,栈最大容量,用什么存储?【记得之前在哪看过一句,大多数据结构可以用数组加链表实现,这里使用数组模拟】
所需功能:出栈,入栈,创建栈,查看栈顶元素,栈空,栈满
public class MyStack {
/**
* 栈的最大容量
*/
private int maxSize;
/**
* 数组模拟栈
*/
private long[] stackArr;
/**
* 栈顶
*/
private int top;
//创建对象时初始化栈容量
public MyStack(int initCapacity){
maxSize = initCapacity; //设置栈容量
stackArr = new long[maxSize]; //创建数组
top = -1; //没有元素,栈顶指向-1
}
/**
* 添加元素到栈顶
* @param newValue
*/
public void push(long newValue) throws StackException {
boolean full = this.isFull();
if (full){
throw new StackException("栈已满");
}else {
try {
//将新的元素添加push至栈顶,栈顶指针指向新元素
//这里一定是++top,如果top++就会导致原栈顶数据被新元素覆写的情况
stackArr[++top] = newValue;
}catch (ArrayIndexOutOfBoundsException e){
throw new StackException("栈已满");
}
}
}
/**
* 从栈顶弹出一个元素
* @return
*/
public long pop(){
if (isEmpty()){
try {
throw new StackException("栈中没有任何元素");
} catch (StackException e) {
e.printStackTrace();
}
return -1;
}else {
return stackArr[top--];
}
}
/**
* 获得栈顶元素
* @return
*/
public long peek() throws StackException {
if (isEmpty()){
throw new StackException("栈中没有任何元素");
}
return stackArr[top];
}
/**
* 判断栈空
* @return
*/
public boolean isEmpty(){
return (top == -1);
}
/**
* 判断栈满
* @return
*/
public boolean isFull(){
return (top == maxSize);
}
}
简单定义一个异常类
public class StackException extends Exception{
public StackException(String message) {
super(message);
}
}
测试
public class TestStack {
public static void main(String[] args) throws StackException{
MyStack myStack = new MyStack(5);
myStack.push(20);
myStack.push(30);
myStack.push(40);
myStack.push(50);
myStack.push(60);
// myStack.push(70);
while (!myStack.isEmpty()){
long peek = myStack.peek();
System.out.println("栈顶元素为:"+peek);
myStack.pop();
}
myStack.pop();
System.out.println("栈已空");
}
}
下次试着使用链表实现栈