栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java数据结构与算法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java数据结构与算法

目录

单链表的删除

完整代码

运行结果

小结

单链表面试题

1.求单链表中有效节点的个数

部分代码

运行结果

 2.查找单链表中的倒数第k个结点

部分代码

运行结果

 3.单链表的反转

部分代码

运行结果

4.从尾到头打印单链表

部分代码

运行结果

 双向链表应用实例

添加部分代码

修改部分代码

删除部分代码

完整代码

运行结果

环形链表介绍

约瑟夫环简介

 构建环形链表的思路如下

完整代码

栈的介绍

栈的应用场景

完整代码


单链表的删除

从单链表中删除一个节点的思路

1.我们先找到需要删除的这个节点的前一个节点temp

2.temp.next=temp.next.next

2.被删除的节点,将不会有其它引用指向,会被垃圾回收机制回收

	//删除节点
	//思路
	//1.head 不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
	//2.说明我们在比较时,是temp.next.no和需要删除的节点no比较
	public void del(int no) {
		Heronode temp=head;
		boolean flag=false;//标志是否找到待 删除节点的
		while(true) {
			if (temp.next==null) {//已经到链表的最后
				break;			
			}
			if (temp.next.no==no) {
				//找到的待删除节点的前一个节点temp
				flag=true;
				break;		
			}
			temp=temp.next;//temp后移,遍历		
		}
		//判断flag
		if (flag) {//找到
			//可以删除
			temp.next=temp.next.next;
		}else {
			System.out.printf("要删除的%d节点不存在n",no);
		}
	}
		//删除一个节点
		singlelinkedList.del(1);
		singlelinkedList.del(4);
		System.out.println("删除后的链表情况~~");
		singlelinkedList.list();

完整代码
package linkedlist;

import java.util.List;

public class SinglelinkedListDemo {

	public static void main(String[] args) {
		//进行测试
		//先创建节点
		Heronode hero1=new Heronode(1, "宋江", "及时雨");
		Heronode hero2=new Heronode(2, "卢俊义", "玉麒麟");
		Heronode hero3=new Heronode(3, "吴用", "智多星");
		Heronode hero4=new Heronode(4, "林冲", "豹子头");
		
		//创建要给链表
		SinglelinkedList singlelinkedList=new SinglelinkedList();
		//加入
//		singlelinkedList.add(hero1);
//		singlelinkedList.add(hero2);
//		singlelinkedList.add(hero3);
//		singlelinkedList.add(hero4);
		
		//加入按照顺序编号的顺序
		singlelinkedList.addByOrder(hero1);
		singlelinkedList.addByOrder(hero4);;
		singlelinkedList.addByOrder(hero2);
		singlelinkedList.addByOrder(hero3);
		
		//测试修改节点的代码
		Heronode newHeronode=new Heronode(2, "小卢", "玉麒麟~~");
		singlelinkedList.update(newHeroNode);
		//显示一把
		System.out.println("修改后的链表情况~~");
		singlelinkedList.list();
		
		//删除一个节点
		singlelinkedList.del(1);
		singlelinkedList.del(4);
		System.out.println("删除后的链表情况~~");
		singlelinkedList.list();
	}
}

//定义SinglelinkedList 管理我们的英雄
class SinglelinkedList{
	//先初始化一个头节点,头节点不要动,不存放具体的数据
	private Heronode head=new Heronode(0, "","");
	
	//添加节点到单向链表
	//思路,当不考虑编号顺序时
	//1.找到当前链表的最后节点
	//2.将最后这个节点的next指向新的节点
	public void add(Heronode heroNode) {
		
		//因为head节点不能动,因此我们需要一个辅助遍历temp
		Heronode temp=head;
		//遍历链表,找到最后
		while (true) {
			//找到链表的最后
			if (temp.next==null) {
				break;
			}
			//如果没有找到最后,将将temp后移
			temp=temp.next;
		}
		//当退出while循环时,temp就指向了链表的最后
		//将最后这个节点的next 指向 新的节点
		temp.next=heroNode;
	}
	
	//第二种方式在添加英雄时,根据排名将英雄插入到指定位置
	//(如果有这个排名,则添加失败,并给出提示)
	public void addByOrder(Heronode heroNode) {
		//因为头节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置
		//因为是单链表,因此我们找的temp是位于添加位置的前一个节点,否则插入不了
		Heronode temp=head;
		boolean flag=false;//标志添加的编号是否存在,默认为false
		while (true) {
			if (temp.next==null) {//说明temp已经在链表的最后
				break;//	
			}
			if (temp.next.no>heroNode.no) {//位置找到,就在temp的后面插入
				break;		
			}else if(temp.next.no==heroNode.no){//说明希望添加的heroNode的编号已然存在
				 
				flag=true;
				break;
			}
			temp=temp.next;//后移,遍历当前链表
		}
		//判断flag的值
		if (flag) {//不能添加,说明编号存在
			System.out.printf("准备插入的英雄的编号%d已经存在了,不能加入n",heroNode.no);
		}else {
			//插入到链表中,temp的后面
			heroNode.next=temp.next;
			temp.next=heroNode;
		}
	}
	
	//修改节点的信息,根据no编号来修改,即no编号不能改
	//说明
	//1.根据newHeroNode的no来修改即可
	
	public void update(Heronode newHeroNode) {
		//判断是否空
		if (head.next==null) {
			System.out.println("链表为空~");
			return;
		}
		//修改节点的信息,根据no编号
		//定义一个辅助变量
		Heronode temp=head.next;
		boolean flag=false;//表示是否找到该节点
		 while (true) {
			if (temp==null) {
				break;
			}
			if (temp.no==newHeroNode.no) {
				//找到
				flag=true;
				break;
			}
			temp=temp.next;
		}
		 //根据flag判断是否找到要修改的节点
		 if (flag) {
			temp.name=newHeroNode.name;
			temp.nickname=newHeroNode.nickname;
		}else {//没有找到
			System.out.printf("没有找到 编号$d的节点,不能修改n",newHeroNode.no);
		}
	}
	//删除节点
	//思路
	//1.head 不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
	//2.说明我们在比较时,是temp.next.no和需要删除的节点no比较
	public void del(int no) {
		Heronode temp=head;
		boolean flag=false;//标志是否找到待 删除节点的
		while(true) {
			if (temp.next==null) {//已经到链表的最后
				break;			
			}
			if (temp.next.no==no) {
				//找到的待删除节点的前一个节点temp
				flag=true;
				break;		
			}
			temp=temp.next;//temp后移,遍历		
		}
		//判断flag
		if (flag) {//找到
			//可以删除
			temp.next=temp.next.next;
		}else {
			System.out.printf("要删除的%d节点不存在n",no);
		}
	}
	
	
	//显示链表[遍历]
	public void list() {
		//判断链表是否为空
		if (head.next==null) {
			System.out.println("链表为空");
			return;
		}
		//因为头节点,不能动,因此我们需要一个辅助变量来遍历
		Heronode temp=head.next;
		while (true) {
			//判断是否到链表最后
			if (temp==null) {
				break;
			}
			//输出节点的信息
			System.out.println(temp);
			//将temp后移,一定小心
			temp=temp.next;
		}
	}
}

//定义HeroNode,每个HeroNode对象就是一个节点
class HeroNode{
	public int no;
	public String name;
	public String nickname;
	public Heronode next;//指向下一个节点
		
	//构造器
	public Heronode(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}
	//为了显示方法,我们重新toString

	@Override
	public String toString() {
		return "Heronode [no=" + no + ", name=" + name + ", nickname=" +nickname + "]";
	}
	
}

运行结果

小结

1)链表是以节点的方式来存储,是链式存储

2)每个节点包含data域,next域,指向下一个节点

3)如图:发现链表的各个节点不一定是连续存储

4)链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 

单链表面试题

1.求单链表中有效节点的个数

部分代码
	//方法:获取到单链表的节点的个数(如果是带头节点的链表,需求不统计头节点)
	
	public static int getLength(Heronode head) {
		if (head.next==null) {//空链表
			return 0;
		}
		int length=0;
		//定义一个辅助的变量
		Heronode cur=head.next;
		while (cur!=null) {
			length++;
			cur=cur.next;//遍历
		}
		return length;
	}
		//测试一下,求单链表中有效节点的个数
		System.out.println("有效的节点个数="+getLength(singlelinkedList.getHead()));//2
运行结果

 2.查找单链表中的倒数第k个结点 部分代码
	//查找单链表中的倒数第k个节点
	//思路:
	//1.编写一个方法,接收head节点,同时接收一个index
	//2.index 表示是倒数第index节点
	//3.先把链表从头到尾遍历,得到链表的总的长度getLength
	//4.得到size后,我们从链表的第一个开始遍历(size-index)个,就可以得到
	//5.如果找到了,则返回该节点,否则返回null
	public static Heronode findLastIndexNode(Heronode head,int index) {
		//判断如果链表为空,返回null
		if (head.next==null) {
			return null;//没有找到
		}
		//第一个遍历得到链表的长度(节点个数)
		int size=getLength(head);
		//第二次遍历size-index位置,就是我们倒数的第k个节点
		//先做一个index的校验
		if (index<=0||index>size) {
			return null;
		}
		//定义给辅助变量,for循环定位到倒数的index
		Heronode cur=head.next;
		for (int i = 0; i < size-index; i++) {
			cur=cur.next;
		}
		return cur;
	}
		//测试一下看看是否得到了倒数第k个节点
		Heronode res=findLastIndexNode(singlelinkedList.getHead(), 1);
		System.out.println("res="+res);

运行结果

 3.单链表的反转

思路:

1.先定义一个节点reverseHead=new Heronode();

2.从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端

3.原来的链表的head.next=reverseHead.next

部分代码
	//将单链表反转
	public static void reversetList(Heronode head) {
		//如果当前链表为空,或者只有一个节点,无需反转,直接返回
		if (head.next==null||head.next.next==null) {
			return;
		}
		//定义一个辅助的指针变量,帮助我们遍历原来的链表
		Heronode cur=head.next;
		Heronode next=null;//指向当前节点[cur]的下一个节点
		Heronode reverseHead=new Heronode(0,"","");
		//遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端
		//动脑筋
		while (cur!=null) {
			next=cur.next;//先暂时保存当前节点的下一个节点,因为后面需要使用
			cur.next=reverseHead.next;//将cur的下一个节点指向新的链表的最前端
			reverseHead.next=cur;//将cur连续到新的链表上
					
			cur=next;//让cur后移
			
		}
		//将head.next指向reverseHead.next,实现单链表的反转
		head.next=reverseHead.next;
	}
		//测试一下单链表的反转功能
		System.out.println("原来链表的情况~~");
		singlelinkedList.list();
		
		System.out.println("反转单链表~~");
		reversetList(singlelinkedList.getHead());
		singlelinkedList.list();
运行结果

4.从尾到头打印单链表

思路:

1.上面的题的要求就是逆序打印单链表

2.方式1:先将单链表进行反转操作,然后再遍历即可,这样的做的问题是会破坏原来的单链表的结构,不建议

3.方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果。

部分代码
	//方式2:
	//可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果
	public static void reversePrint(Heronode head) {
		if (head.next==null) {
			return;//空链表,不能打印
		}
		//创建要给一个栈,将各个节点压入栈
		Stack stack=new Stack();
		Heronode cur=head.next;
		//将链表的所有节点压入栈
		while (cur!=null) {
			stack.push(cur);
			cur=cur.next;//cur后移,这样就可以压入下一个节点
		}
		//将栈中的节点进行打印,pop出栈
		while (stack.size()>0) {
			System.out.println(stack.pop());//stack的特点是先进后出
			
		}
	}
package linkedlist;

import java.util.Stack;

public class TestStack {

	public static void main(String[] args) {
		Stack stack=new Stack();
		//入栈
		stack.add("jack");
		stack.add("tom");
		stack.add("smith");
		
		//出栈
		//smith,tom,jack
		while (stack.size()>0) {
			System.out.println(stack.pop());//pop就是将栈顶的数据取出
			
		}
	}
}
运行结果

 双向链表应用实例

 分析双向链表的遍历,添加,修改,删改的操作思路--->代码实现

1)遍历方和单链表一样,只是可以向前,也可以向后查找

2)添加(默认添加到双向链表的最后)

(1)先找到双向链表的最后这个节点

(2)temp.next=newHeroNode

(3)newHeroNode.pre=temp

3)修改思路和原理单向链表一样

4)删除

(1)因为是双向链表,因此,我们可以实现自我删除某个节点

(2)直接找到要删除的这个节点,比如temp

(3)temp.pre.next=temp.next

  (4)temp.next.pre=temp.pre;

添加部分代码
		public void add(HeroNode2 heroNode) {
			
			//因为head节点不能动,因此我们需要一个辅助遍历temp
			HeroNode2 temp=head;
			//遍历链表,找到最后
			while (true) {
				//找到链表的最后
				if (temp.next==null) {
					break;
				}
				//如果没有找到最后,将将temp后移
				temp=temp.next;
			}
			//当退出while循环时,temp就指向了链表的最后
			//将最后这个节点的next 指向 新的节点
			temp.next=heroNode;
			heroNode.pre=temp;
		}

修改部分代码
		public void update(HeroNode2 newHeroNode) {
			//判断是否空
			if (head.next==null) {
				System.out.println("链表为空~");
				return;
			}
			//修改节点的信息,根据no编号
			//定义一个辅助变量
			HeroNode2 temp=head.next;
			boolean flag=false;//表示是否找到该节点
			 while (true) {
				if (temp==null) {
					break;
				}
				if (temp.no==newHeroNode.no) {
					//找到
					flag=true;
					break;
				}
				temp=temp.next;
			}
			 //根据flag判断是否找到要修改的节点
			 if (flag) {
				temp.name=newHeroNode.name;
				temp.nickname=newHeroNode.nickname;
			}else {//没有找到
				System.out.printf("没有找到 编号$d的节点,不能修改n",newHeroNode.no);
			}
		}

删除部分代码
		//删除节点
		//思路
		//1.head 不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
		//2.说明我们在比较时,是temp.next.no和需要删除的节点no比较
		public void del(int no) {
			
			//判断当前链表是否为空
			if (head.next==null) {//空链表
				System.out.println("链表为空,无法删除");
				return;
			}
			HeroNode2 temp=head.next;
			boolean flag=false;//标志是否找到待 删除节点的
			while(true) {
				if (temp.next==null) {//已经到链表的最后
					break;			
				}
				if (temp.next.no==no) {
					//找到的待删除节点的前一个节点temp
					flag=true;
					break;		
				}
				temp=temp.next;//temp后移,遍历		
			}
			//判断flag
			if (flag) {//找到
				//可以删除
				temp.next=temp.next.next;
				
				//如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
				temp.next.pre=temp.pre;
			}else {
				System.out.printf("要删除的%d节点不存在n",no);
			}
		}
完整代码
package linkedlist;

public class DoublelinkedListDemo {
	public static void main(String[] args) {
		//测试
		System.out.println("双向链表的测试");
		//先创建节点
		HeroNode2 hero1=new HeroNode2(1, "宋江", "及时雨");
		HeroNode2 hero2=new HeroNode2(2, "卢俊义", "玉麒麟");
		HeroNode2 hero3=new HeroNode2(3, "吴用", "智多星");
		HeroNode2 hero4=new HeroNode2(4, "林冲", "豹子头");
		
		//创建一个双向链表
		DoublelinkedList doublelinkedList=new DoublelinkedList();
		doublelinkedList.add(hero1);
		doublelinkedList.add(hero2);
		doublelinkedList.add(hero3);
		doublelinkedList.add(hero4);
		
		doublelinkedList.list();
		
		//修改
		HeroNode2 newHeronode=new HeroNode2(4, "公孙胜","入云龙");
		doublelinkedList.update(newHeroNode);
		System.out.println("修改后的链表情况");
		doublelinkedList.list();
		
		//删除
		doublelinkedList.del(3);
		System.out.println("删除后的链表情况~~");
		doublelinkedList.list();
	}
}
	//创建一个双向链表的类
	class DoublelinkedList{
		
		//先初始化一个头节点,头节点不要动,不存放具体的数据
		private HeroNode2 head=new HeroNode2(0, "","");
		
		//返回头节点
		public HeroNode2 getHead() {
			return head;
		}
		//显示链表[遍历]
		public void list() {
			//判断链表是否为空
			if (head.next==null) {
				System.out.println("链表为空");
				return;
			}
			//因为头节点,不能动,因此我们需要一个辅助变量来遍历
			HeroNode2 temp=head.next;
			while (true) {
				//判断是否到链表最后
				if (temp==null) {
					break;
				}
				//输出节点的信息
				System.out.println(temp);
				//将temp后移,一定小心
				temp=temp.next;
			}
		}
		public void add(HeroNode2 heroNode) {
			
			//因为head节点不能动,因此我们需要一个辅助遍历temp
			HeroNode2 temp=head;
			//遍历链表,找到最后
			while (true) {
				//找到链表的最后
				if (temp.next==null) {
					break;
				}
				//如果没有找到最后,将将temp后移
				temp=temp.next;
			}
			//当退出while循环时,temp就指向了链表的最后
			//将最后这个节点的next 指向 新的节点
			temp.next=heroNode;
			heroNode.pre=temp;
		}
		
		public void update(HeroNode2 newHeroNode) {
			//判断是否空
			if (head.next==null) {
				System.out.println("链表为空~");
				return;
			}
			//修改节点的信息,根据no编号
			//定义一个辅助变量
			HeroNode2 temp=head.next;
			boolean flag=false;//表示是否找到该节点
			 while (true) {
				if (temp==null) {
					break;
				}
				if (temp.no==newHeroNode.no) {
					//找到
					flag=true;
					break;
				}
				temp=temp.next;
			}
			 //根据flag判断是否找到要修改的节点
			 if (flag) {
				temp.name=newHeroNode.name;
				temp.nickname=newHeroNode.nickname;
			}else {//没有找到
				System.out.printf("没有找到 编号$d的节点,不能修改n",newHeroNode.no);
			}
		}
		//删除节点
		//思路
		//1.head 不能动,因此我们需要一个temp辅助节点找到待删除节点的前一个节点
		//2.说明我们在比较时,是temp.next.no和需要删除的节点no比较
		public void del(int no) {
			
			//判断当前链表是否为空
			if (head.next==null) {//空链表
				System.out.println("链表为空,无法删除");
				return;
			}
			HeroNode2 temp=head.next;
			boolean flag=false;//标志是否找到待 删除节点的
			while(true) {
				if (temp.next==null) {//已经到链表的最后
					break;			
				}
				if (temp.next.no==no) {
					//找到的待删除节点的前一个节点temp
					flag=true;
					break;		
				}
				temp=temp.next;//temp后移,遍历		
			}
			//判断flag
			if (flag) {//找到
				//可以删除
				temp.next=temp.next.next;
				
				//如果是最后一个节点,就不需要执行下面这句话,否则出现空指针
				temp.next.pre=temp.pre;
			}else {
				System.out.printf("要删除的%d节点不存在n",no);
			}
		}
	}

	//定义HeroNode2,每个HeroNode对象就是一个节点
	class HeroNode2{
		public int no;
		public String name;
		public String nickname;
		public HeroNode2 next;//指向下一个节点
		public HeroNode2 pre;
		
		//构造器
		public HeroNode2(int no, String name, String nickname) {
			this.no = no;
			this.name = name;
			this.nickname = nickname;
		}
		//为了显示方法,我们重新toString

		@Override
		public String toString() {
			return "Heronode [no=" + no + ", name=" + name + ", nickname=" +nickname + "]";
		}
		
	}
运行结果

环形链表介绍

环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来。单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个结点的链域指向链表结点。 简单点说链表首位相连,组成环状数据结构。

如图所示:

约瑟夫环简介


约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

假设现在约瑟夫环有5个人,从第1个开始报数,数到2的出列。

那么出圈的顺序为2—>4—>1—>5—>3
要实现约瑟夫环问题,得先构建一个环形链表,再分析出圈思路。

 构建环形链表的思路如下

1 创建第一个节点,并让头指针first指向该节点,形成自环。
2 我们每创建一个节点,就把该创建的节点加到环中,并把新节点的next指向first节点。

完整代码
public class Josepfu {
    public static void main(String[] args) {
        CircleSinglelinkedList linkedList = new CircleSinglelinkedList();
        linkedList.addBody(5);
        linkedList.showBoys();
    }
}



//创建一个环形的单向链表
class CircleSinglelinkedList{
    //创建一个first节点,当前没有编号
    private  Boy first = null;


    //添加小孩节点,构建一个环形链表
    public void addBody(int k){
        if(k<2){
            System.out.println("请添加两个及两个以上的小孩");
            return;
        }
        Boy curBoy = null;
        for(int i=1;i<=k;i++){
            Boy boy = new Boy(i);
            if(i==1){
                first=boy;
                first.setNext(first);
                curBoy = boy;
            }else{
               curBoy.setNext(boy);
               boy.setNext(first);
               curBoy=boy;
            }
        }
    }

    //遍历环形链表
    public void showBoys(){
        if(first==null){
            System.out.println("链表为空");
        }
        Boy curBoy =first;
        while(true){
            System.out.printf("小孩的编号为%dn",curBoy.getNo());
            if(curBoy.getNext()==first){
                break;
            }
            curBoy= curBoy.getNext();
        }
    }

}

//创建一个boy类,表示一个节点
class Boy{
    private int no;
    private Boy next;  //指向下一个节点默认为空

    public Boy(int no) {
        this.no = no;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public Boy getNext() {
        return next;
    }

    public void setNext(Boy next) {
        this.next = next;
    }
}

栈的介绍

1.栈的英文名称为stack。
2.栈是一个先入后出的有序列表。
3.栈 是 限制 线性表中元素的插入和删除 ,只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称之为栈顶,另一端为固定的一端,称之为栈底。
4.根据栈的定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素先删除,最先放入的元素最后删除。


栈的应用场景

子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,知道子程序执行完后再将地址取出,以回到原来的程序中
处理递归调用:和子程序的调用类似,只是除了存储下一个指令的地址外,也将参数、区域变量等数据存入堆栈中
表达式的转换(中缀表达式转后缀表达式)与求值
二叉树的遍历
图形的深度优先(depth-first)搜索法

完整代码
 
import java.util.Scanner;


public class ArrayStackDemo {
    public static void main(String[] args) {
        //测试ArrayStack
        //先创建ArrayStack对象->表示栈
        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("push:添加数据到栈");
            System.out.println("pop :从栈中取出数据");
            System.out.println("exit:退出程序");
            System.out.println("请输入选择:");
            key = scanner.next();
            switch (key) {
                case "show":
                    arrayStack.list();
                    break;
                case "push":
                    System.out.println("输入一个数");
                    int value = scanner.nextInt();
                    arrayStack.push(value);
                    break;
                case "pop":
                    try {
                        int result = arrayStack.pop();
                        System.out.printf("出栈的数据是%dn", result);
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    }
                    break;
                case "exit":
                    scanner.close();
                    loop = false;
                    break;
                default:
                    break;
            }
        }
        System.out.println("程序退出");
    }
}

class ArrayStack {
    
    private final int maxSize;
    
    private final 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]=%dn", i, stack[i]);
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/287104.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号