数据结构与算法学习(java)-栈
题目一:用数组实现栈
- 要求:
* 用数组形式实栈的基本功能,入栈,出栈及显示栈元素功能 - 思路:
1.准备一个数组int[] stack;需要变量maxSize表示栈的大小
2.入栈(push):需要一个变量(top)来表示栈顶,初始化为-1;当有数据入栈时,top增加,同时将数据传递给stack[top].
3.出栈(pop):需要定义变量来接住stack[top],然后top减少,同时返回该变量.
4.特殊情况:入栈前需要判断栈是否已满;出栈时需要判断栈是否为空.
//倒包
import java.util.Scanner;
public class ArrayToStackDemo {
public static void main(String[] args) {
//Test
//创建一个栈
ArrayStack stack=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":
stack.showStack();
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();
//将循环标志位置为false
loop=false;
break;
}
}
System.out.println("程序退出");
}
}
class ArrayStack{
private int maxSize;//栈的大小
private int[] stack;//数组,栈的数据放在该数组中
private int top=-1;//栈顶的指针
//构造器
public ArrayStack(int maxSize){
this.maxSize=maxSize;
//数组初始化大小
this.stack=new int[maxSize];
}
//栈是否已满判断
public boolean isFull(){
return top==maxSize-1;
}
//栈是否为空判断
public boolean isEmpty(){
return top==-1;
}
//入栈
//参数:入栈的值
public void push(int value){
//判断栈是否已满
if(this.isFull()){
System.out.println("此栈已满");
return;
}
top++;
stack[top]=value;
}
//出栈
public int pop(){
//判断是否为空
if(this.isEmpty()){
//System.out.println("此栈为空栈");
//因为无法返回具体的值,但是函数又是需要返回的类型,因此用抛出异常的形式表达
throw new RuntimeException("此栈为空栈");
}
int value=stack[top];
top--;
return value;
}
//显示栈
//遍历时,需要从栈顶开始
public void showStack(){
//先判断是否为空
if(this.isEmpty()){
System.out.println("此栈为空");
return;
}
//遍历栈
for(int i=top;i>=0;i--){
System.out.println(stack[i]);
}
}
}
总结:
1.在出栈的方法中,因为方法需要返回值,因此在判断为空的情况下,我们无法返回具体的值,可以用抛出异常的方式来提醒:throw new RuntimeException("…");而在调用的过程中,因此存在异常,我们需要采用try{}catch的方式来调用即可.
2.[暂时忘记,后续补充]