[Java数据结构][4]栈的Java代码实现
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
下面来看代码
定义一个栈
/*
定义一个类表示栈
*/
class ArrayStack {
private int maxSize; //栈的大小
private int[] stack; //数组模拟栈,数据放在该数组中
private int top = -1; //top 表示栈底,初始化为-1
构造器
/*
构造器
*/
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
栈满、栈空
空的情况,top指向-1的位置
栈满时,top已经指向了最后一个元素的索引,此时输出栈慢
/*
栈满
*/
public boolean isFull() {
return top == maxSize - 1;
}
/*
栈空
*/
public boolean isEmpty() {
return top == -1;
}
入栈出栈
/*
入栈
*/
public void push(int value) {
//先判断栈是否满
if (isFull()) {
System.out.println("栈已满~~");
return;
}
top++;
stack[top] = value;
}
/*
出栈,将栈顶的数据返回
*/
public int pop(){
//先判断是否为空
if(isEmpty()){
//抛出异常
throw new RuntimeException("栈空,没有数据");
}
int value = stack[top];
top--;
return value;
}
显示栈
按照从栈顶到栈底的顺序
/*
显示栈的情况
*/
public void list(){
if(isEmpty()){
System.out.println("栈空,没有数据");
return;
}
//从栈顶显示数据
for (int i = top; i >= 0 ; i--) {
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
编写测试案例及完整代码
import java.util.Scanner;
public class Stack {
public static void main(String[] args) {
//test~
ArrayStack stack = new ArrayStack(4);
String Key = "";
boolean loop = true; //控制是否退出菜单
Scanner sc = new Scanner(System.in);
while(loop){
System.out.println("show:显示栈");
System.out.println("exit:退出栈");
System.out.println("push:添加数据到栈");
System.out.println("pop:从栈取出数据");
System.out.println("请输入指令");
Key = sc.next();
switch (Key){
case "show":
stack.list();
break;
case "exit":
sc.close();
loop = false;
break;
case "push":
System.out.print("请输入一个数:");
int value = sc.nextInt();
stack.push(value);
break;
case "pop":
try{
int res = stack.pop();
System.out.printf("出栈的数据是%d\n",res);
} catch (Exception e){
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
System.out.println("程序退出了~~~");
}
}
/*
定义一个类表示栈
*/
class ArrayStack {
private int maxSize; //栈的大小
private int[] stack; //数组模拟栈,数据放在该数组中
private int top = -1; //top 表示栈底,初始化为-1
/*
构造器
*/
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
/*
栈满
*/
public boolean isFull() {
return top == maxSize - 1;
}
/*
栈空
*/
public boolean isEmpty() {
return top == -1;
}
/*
入栈
*/
public void push(int value) {
//先判断栈是否满
if (isFull()) {
System.out.println("栈已满~~");
return;
}
top++;
stack[top] = value;
}
/*
出栈,将栈顶的数据返回
*/
public int pop(){
//先判断是否为空
if(isEmpty()){
//抛出异常
throw new RuntimeException("栈空,没有数据");
}
int value = stack[top];
top--;
return value;
}
/*
显示栈的情况
*/
public void list(){
if(isEmpty()){
System.out.println("栈空,没有数据");
return;
}
//从栈顶显示数据
for (int i = top; i >= 0 ; i--) {
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}
执行结果
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
push
请输入一个数:10
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
push
请输入一个数:15
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
push
请输入一个数:20
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
show
stack[2]=20
stack[1]=15
stack[0]=10
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
pop
出栈的数据是20
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
pop
出栈的数据是15
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
show
stack[0]=10
show:显示栈
exit:退出栈
push:添加数据到栈
pop:从栈取出数据
请输入指令
exit
程序退出了~~~
Process finished with exit code 0