1、创建栈
private int maxSize; // 代表栈的最大容量是多少
private int[] stack; // 使用数组来存放数据
private int top = -1; // 栈顶指针的初始位置
class ArrayStack{
private int maxSize; // 栈的大小
private int[] stack; // 数据
private int top = -1; // 栈顶指针
// 构造函数
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
}
}
2、判断栈是为空的标志
当top栈顶指针位于初始位置也就是-1位置的时候就是空的。
// 栈空
public boolean isEmpty() {
return top == -1;
}
3、判断栈是满的标志
当栈顶指针移动到最大的位置时,即 top = maxSize - 1 时,栈达到最大容量。
// 栈满
public boolean isFull() {
return top == maxSize - 1;
}
4、push入栈
top栈顶指针先向上移动,即top++,然后传入数据,使得stack[top] = data;
// 入栈push
public void push(int data) {
// 先判断栈是否满
if(isFull()) {
System.out.println("栈已经满了");
return;
}
stack[++top] = data;
}
5、pop出栈
栈顶指针top先向下移动一个位置,然后取出数据stack[top],并返回。
// 出栈pop
public int pop() {
if(isEmpty()) {
throw new RuntimeException("栈为空");
}
int data = stack[top--];
return data;
}
6、栈的遍历
与出栈不同,遍历栈并不会改变栈的结构。
// 遍历栈
public void show() {
if(isEmpty()) {
System.out.println("栈为空,无数据");
return;
}
for(int i = top; i >= 0; i--) {
System.out.println("stack["+ i +"]=" + stack[i]);
}
}
7、测试
public class ArrayStackDemo {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(4);
String key = "";
boolean loop = true; // 控制是否退出菜单
Scanner scanner = 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 = scanner.next();
switch (key) {
case "show": {
arrayStack.show();
break;
}
case "push": {
System.out.println("请输入一个整数:");
int value = scanner.nextInt();
arrayStack.push(value);
break;
}
case "pop": {
try {
int pop = arrayStack.pop();
System.out.println("出栈的数据是:" + pop);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
}
case "exit": {
scanner.close();
loop = false;
break;
}
default:
break;
}
}
System.out.println("程序成功退出");
}
}
8、整体代码
import java.util.Scanner;
public class ArrayStackDemo {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(4);
String key = "";
boolean loop = true; // 控制是否退出菜单
Scanner scanner = 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 = scanner.next();
switch (key) {
case "show": {
arrayStack.show();
break;
}
case "push": {
System.out.println("请输入一个整数:");
int value = scanner.nextInt();
arrayStack.push(value);
break;
}
case "pop": {
try {
int pop = arrayStack.pop();
System.out.println("出栈的数据是:" + pop);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
}
case "exit": {
scanner.close();
loop = false;
break;
}
default:
break;
}
}
System.out.println("程序成功退出");
}
}
class ArrayStack{
private int maxSize; // 栈的大小
private int[] stack; // 数据
private int top = -1; // 栈顶指针
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[maxSize];
}
// 栈满
public boolean isFull() {
return top == maxSize - 1;
}
// 栈空
public boolean isEmpty() {
return top == -1;
}
// 入栈push
public void push(int data) {
// 先判断栈是否满
if(isFull()) {
System.out.println("栈已经满了");
return;
}
stack[++top] = data;
}
// 出栈pop
public int pop() {
if(isEmpty()) {
throw new RuntimeException("栈为空");
}
int data = stack[top--];
return data;
}
// 遍历栈
public void show() {
if(isEmpty()) {
System.out.println("栈为空,无数据");
return;
}
for(int i = top; i >= 0; i--) {
System.out.println("stack["+ i +"]=" + stack[i]);
}
}
}