目录
一、栈的介绍(Stack)
- 栈是一个先进后出(FILO)的有序列表。
- 栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
- 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。
- 图解方式说明出栈(pop)和入栈(push)的概念
二、用数组模拟栈
用数组模拟栈的使用,由于栈是一种有序列表,当然可以使用数组的结构来存储栈的数据内容。
2.1、思路分析
2.2、代码实现
2.2.1、创建一个类表示栈
class Stack{
private int maxSize; // 栈的大小
private int[] stack; // 数组,模拟栈
private int top=-1; // top表示栈顶,初始化为-1
// 构造器
public Stack(int maxSize) {
this.maxSize = maxSize;
stack=new int[this.maxSize];
}
}
2.2.2、判断栈是否为空
// 判断栈是否为空
public boolean isEmpty(){
return top==-1;
}
2.2.3、判断栈是否满
// 判断栈是否满
public boolean isFull(){
return top+1==maxSize;
}
2.2.4、入栈(push)
// 入栈
public void push(int value){
// 先判断栈是否满
if(isFull()){
System.out.println("栈满");
return;
}
top++;
stack[top]=value;
}
2.2.5、出栈(pop)
// 出栈 ,将栈顶元素返回
public int pop(){
if(isEmpty()){
throw new RuntimeException("栈空");
}
int value=stack[top];
top--;
return value;
}
2.2.6、显示栈
// 显示栈的情况
public void list(){
if(isEmpty()){
System.out.println("栈空");
return;
}
// 需要从栈顶开始显示数据
for(int i=top;i>=0;i--){
System.out.printf("stack[%d]=%d",i,stack[i]);
}
}
三、测试类
3.1、测试结果以及代码
public class ArrayStack {
public static void main(String[] args) {
System.out.println("开始测试栈");
Stack stack=new Stack(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":
stack.list();
break;
case "push":
System.out.println("请输入入栈的数据");
int value=scanner.nextInt();
stack.push(value);
break;
case "pop":
try{
int res=stack.pop();
System.out.printf("出栈的数据是:%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
测试结果图:
3.2、完整代码
public class ArrayStack {
public static void main(String[] args) {
System.out.println("开始测试栈");
Stack stack=new Stack(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.printf("请输入你的选择:");
key=scanner.next();
switch (key){
case "show":
stack.list();
break;
case "push":
System.out.printf("请输入入栈的数据:");
int value=scanner.nextInt();
stack.push(value);
break;
case "pop":
try{
int res=stack.pop();
System.out.printf("出栈的数据是:%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
}
class Stack{
private int maxSize; // 栈的大小
private int[] stack; // 数组,模拟栈
private int top=-1; // top表示栈顶,初始化为-1
// 构造器
public Stack(int maxSize) {
this.maxSize = maxSize;
stack=new int[this.maxSize];
}
// 判断栈是否为空
public boolean isEmpty(){
return top==-1;
}
// 判断栈是否满
public boolean isFull(){
return top+1==maxSize;
}
// 入栈
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]);
}
}
}