首先 这个栈的类名为 Mystack;
public class MyStack{}
接着规定栈的基本结构:
- 需要一个空间存储数值,这里用数组来存储数据;
- 一个size变量 指示当前栈的大小;
- 一个top指针 始终指向栈顶,以便完成出栈入栈操作;
- 因为数组 有空间大小 所以需要一个MAX_SIZE来规定当前数组最大容量,防止发生数据溢出。
- 为了实现数组动态扩容增加一个addSize变量来记录每次扩容增加的空间。
综合上述要求 可以完成 Mystack类的成员变量
private int value[];//存储数据,规定value[0]不存值,当top指向value[0]时表示栈空;
private int size;//标记当前栈大小
private int top;//始终指向栈顶
private int MAX_size;//记录栈的最大容量
private int addSize=10;//每次扩容 增加的栈的大小
public MyStack() {//栈的初始化方法
this.MAX_size=5;
this.value = new int[this.MAX_size+1];//因为value[0]不存值,所以创建数组时需要多创建一个位置。
this.size = 0;
this.top = 0;
}
然后实现栈的基本功能:
- 数组扩容
private void addArraySize(){
MAX_size +=addSize;
addSize*=2;//每次扩容后下次增加的空间加倍
int[] temp = new int[MAX_size+1];//新建一个数组
for (int i=0;i<=size;i++){//将原数组搬家到新数组 可以用Arrays.copyOf完成
temp[i]=value[i];
}
value=temp;//使原数组指向新数组
}
- 数据入栈(push)
public void push(int number){//将数据存入数组,栈大小增加(size++)
if (size+1>MAX_size){//如果比最大容量大 则先对数组扩容。
addArraySize();
}
value[++top] = number;
size++;
}
- 栈判空
public boolean isEmpty(){//判空规则为 当top指向栈顶则栈为空
if (top==0)
return true;
else
return false;
}
- 数据出栈(pop)
public int pop() throws Exception {//栈非空时,数据出栈 栈大小减一(size--) 否则抛出异常
int result;
if (!isEmpty()){
result = value[top--];
size--;
}else {
throw new Exception("stack is empty");
}
return result;
}
- 获取栈顶数据(非出栈)
public int getTop() throws Exception {//栈非空时,取栈顶数据
if (!isEmpty())
return value[top];
else
throw new Exception("stack is empty");
}
- 获取当前栈的大小
public int getSize() {
return size;
}
- 重写toString方法 方便测试
public String toString(){//输出时,只输出有值的数据
int temp[] = new int[size];
for (int i=0;i<size;i++)
temp[i]=value[size-i];
return Arrays.toString(temp);
}
至此 栈的基本功能就完成了
测试代码
public static void testMyStack() throws Exception {
Scanner input = new Scanner(System.in);
MyStack stack = new MyStack();
int cas =0;
while (cas!=5){
System.out.println("1:入栈");
System.out.println("2:出栈");
System.out.println("3:显示当前栈中所有数据");
System.out.println("4:获取栈顶数据");
cas = input.nextInt();
switch (cas){
case 1:
int number = input.nextInt();
stack.push(number);break;
case 2:
System.out.println(stack.pop());break;
case 3:
System.out.println(stack.toString());break;
case 4:
System.out.println("topValueis: "+stack.getTop()+" Size:"+stack.getSize());
}
}
}
附上栈的完整代码
import java.util.Arrays;
// top=0表示栈空 0位置作为初始位置 不存值
public class MyStack {
private int value[];//存储数据,规定value[0]不存值,当top指向value[0]时表示栈空;
private int size;//标记当前栈大小
private int top;//始终指向栈顶
private int MAX_size;//记录栈的最大容量
private int addSize=10;//每次扩容 增加的栈的大小
public MyStack() {//栈的初始化方法
this.MAX_size=5;
this.value = new int[this.MAX_size+1];//因为value[0]不存值,所以创建数组时需要多创建一个位置。
this.size = 0;
this.top = 0;
}
public void push(int number){//将数据存入数组,栈大小增加(size++)
if (size+1>MAX_size){//如果比最大容量大 则先对数组扩容。
addArraySize();
}
value[++top] = number;
size++;
}
public int pop() throws Exception {//栈非空时,数据出栈 栈大小减一(size--) 否则抛出异常
int result;
if (!isEmpty()){
result = value[top--];
size--;
}else {
throw new Exception("stack is empty");
}
return result;
}
public boolean isEmpty(){//判空规则为 当top指向栈顶则栈为空
if (top==0)
return true;
else
return false;
}
public int getTop() throws Exception {//栈非空时,取栈顶数据
if (!isEmpty())
return value[top];
else
throw new Exception("stack is empty");
}
private void addArraySize(){
MAX_size +=addSize;
addSize*=2;//每次扩容后下次增加的空间加倍
int[] temp = new int[MAX_size+1];//新建一个数组
for (int i=0;i<=size;i++){//将原数组搬家到新数组 可以用Arrays.copyOf完成
temp[i]=value[i];
}
value=temp;//使原数组指向新数组
}
public String toString(){//输出时,只输出有值的数据
int temp[] = new int[size];
for (int i=0;i<size;i++)
temp[i]=value[size-i];
return Arrays.toString(temp);
}
public int getSize() {
return size;
}
}