动态数组和普通数组的区别是:普通数组定义好长度后不可改变,而动态数组会在数组满时修改数组的最大长度。
package stack;
import java.util.Scanner;
public class StackDemo1 {
private int[] stack;//用数组模拟栈
private int maxSize;//定义栈的大小
private int top=-1;//定义栈顶
//构造器
StackDemo1(){
}
StackDemo1(int max){
maxSize=max;
stack=new int[maxSize];
}
//判断栈空
boolean isEmpty(){
return top==-1?true:false;//用三元运算符判断,空返回true
}
//判断栈满
boolean isFull(){
return top==maxSize-1?true:false;//用三元运算符判断,空返回true
}
//数组扩容
public void doubleSize(){
int[] newstackarray = new int[maxSize*2];//定义一个新数组,长度为二倍
for(int i = 0;i<=top;i++){//把原先的栈赋值给新的栈
newstackarray[i] = stack[i];
}
maxSize *=2;//重新规定栈的大小
stack= newstackarray;//把新栈赋值给之前的栈
}
//存入数据
public void push(int value){
if(isFull()){
doubleSize();
}
top++;
stack[top]=value;
}
//取出数据
public void pop(){
if(!isEmpty()){
System.out.println(stack[top]);
top--;
}else{
throw new RuntimeException("数组空,不能取数据");
}
}
//展示所有数据
public void list(){
if(isEmpty()){
throw new RuntimeException("数组为空");
}
for(int i=0;i<=top;i++){
System.out.printf("stack[%d]=%d",i,stack[i]);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入栈的大小");
StackDemo1 stackDemo = new StackDemo1(scanner.nextInt());
while(true){
System.out.println("pop取出数据");
System.out.println("push存入数据");
System.out.println("list展示数据");
System.out.println("exit展示数据");
System.out.println("输入一个数");
String s=scanner.next();
switch (s){
case "pop":
stackDemo.pop();
break;
case "push":
int s1=scanner.nextInt();
stackDemo.push(s1);
break;
case "list":
stackDemo.list();
break;
case "exit":
break;
}
}
}
}