栈的特点:
- 栈只能从表的一端存取数据,另一端是封闭的,如图 1 所示;
- 在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。拿图 1 的栈来说,从图中数据的存储状态可判断出,元素 1 是最先进的栈。因此,当需要从栈中取出元素 1 时,根据"先进后出"的原则,需提前将元素 3 和元素 2 从栈中取出,然后才能成功取出元素 1。
- 下面的代码是用数组实现的
package stack;
import java.util.Scanner;
public class stackDemo {
private int[] stack;//用数组模拟栈
private int maxSize;//定义栈的大小
private int top=-1;//定义栈顶
//构造器
stackDemo(){
}
stackDemo(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 push(int value){
if(!isFull()){//判断是否为满
top++;
stack[top]=value;
}else{
throw new RuntimeException("数组满不能存");
}
}
//取出数据
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("输入栈的大小");
stackDemo stackDemo = new stackDemo(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;
}
}
}