使用数组模拟栈的实现过程
1.栈的介绍
(1) 栈的英文为(stack)
(2) 栈是一个先入后出(FILO-First In Last Out)的有序列表。
(3) 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的 一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom)。
(4) 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元 素最先删除,最先放入的元素最后删除
(5) 图解方式说明出栈(pop)和入栈(push)的概念
2.栈的应用场景
(1) 子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以 回到原来的程序中。
(2) 处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆 栈中。
(3) 表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。
(4) 二叉树的遍历。
(5) 图形的深度优先(depth 一 first)搜索法。
3.使用数组模拟
(1)示意图
(2)思路分析
1)使用数组模拟栈
2)定义一个top,初始化top为-1
3)入栈的操作:top++; stack[top]=value;
4)出栈的操作:int value=stack[top]; top--; return value;
(3)代码实现
package cn.zzw.algorithm.Stack;
import java.util.Scanner;
public class ArrayStackDemo {
public static void main(String[] args) {
//创建一个栈空间
ArrayStack stack=new ArrayStack(3);
String key="";
Scanner scanner = new Scanner(System.in);
boolean loop=true;
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("程序已经退出");
}
}
class ArrayStack
{
private int maxSize;
private int[] stack;//使用数组模拟栈
private int 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]);
}
}
}
(4)测试结果
"C:\Program Files\Java\jdk1.8.0_181\bin\java.exe" "-javaagent:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=16739:D:\IntelliJ IDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_181\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_181\jre\lib\rt.jar;C:\Users\1\IdeaProjects\algorithm\out\production\algorithm" cn.zzw.algorithm.Stack.ArrayStackDemo
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
栈中没有数据
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
20
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
30
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
push
请输入入栈的元素
50
栈满,不能再添加元素
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
stack[2]=30
stack[1]=20
stack[0]=10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
出栈的元素是30
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
stack[1]=20
stack[0]=10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
出栈的元素是20
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
出栈的元素是10
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
pop
栈空
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作
show
栈中没有数据
show:显示栈
exit:退出程序
push:添加元素到栈中
pop:元素出栈
请输入您的操作