数组模拟栈(Stack)
栈的介绍
1.栈是一个先进后出(FILO-First In Last Out)的有序列表
2.栈(Stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端为变化的一端,我们称之为栈顶(top),另一端为固定的一端,我们称之为栈底(Bottom)。
3.根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素正好先反,最后放入的元素最先删除,最先放入的元素最后删除。
4.图示:
栈的举例
1.用数组模拟栈的使用,由于栈是一种有序列表,可以使用数组的结构来存储栈的数据内容。
2.示意图即思路分析
思路分析:
使用数组来模拟栈,定义一个top来表示栈顶,初始化为-1
入栈操作:当有数据加入到栈是,top++;stack[top]=value;
出栈操作:int value=stack[top]; top--;return value;
源代码
package com.atxihua; import java.util.Scanner; public class ArrayStackDemo { public static void main(String[] args) { //测试 //先创建一个ArrayStack对象表示栈 ArrayStack stack=new ArrayStack(4); String key=""; boolean loop=true;//控制是否退出菜单 Scanner scanner=new Scanner(System.in); System.out.println("show:表示显示栈"); System.out.println("exit:退出程序"); System.out.println("push:表示添加数据到栈(入栈)"); System.out.println("pop:表示从栈中取出数据(出栈)"); System.out.println("请输入你的选择"); while (loop){ 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": int res=stack.pop(); System.out.println("出栈的数据是:"+res); break; case "exit": scanner.close(); loop=false; break; } } } } //定义一个ArrayStack表示栈 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; } //入栈-push public void push(int value){ //先判断是否栈满 if(isFull()){ System.out.println("栈满"); return; } top++; stack[top]=value; } //出栈-pop,将栈顶的数据返回 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.println(stack[i]); } } }
运行结果
如此,就简单的用数组模拟了栈的实现。