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

栈和队列

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

栈和队列

栈是一种基于先进后出 (FILO) 的数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出 的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一 个数据被第一个读出来)。 我们称数据进入到栈的动作为 压栈 ,数据从栈中出去的动作为 弹栈 。

代码实现: 

public class Stack implements Iterable{
	private Node head;
	private int N;
//	定一个内部类
	private static class Node{
		T item;
		Node next;
		public Node(T item,Node next) {
			this.item=item;
			this.next=next;
		}
	}
//	构造方法
	public Stack() {
		this.head=new Node(null,null);
		this.N=0;
	}
//	判断栈中元素是否为空
	public boolean isEmpty() {
		return N==0;
	}
//	返回栈中元素个数
	public int size() {
		return N;
	}
//	把t元素压入栈中
	public void push(T t) {
		Node oldfirst=head.next;
		Node newNode=new Node(t,null);
		head.next=newNode;
		newNode.next=oldfirst;
		N++;
	}
//	弹出栈中的元素
	public T pop() {
		Node oldfirst=head.next;
		if(oldfirst==null) {
			return null;
		}
		head.next=oldfirst.next;
		N--;
		return oldfirst.item;
	}
	@Override
	public Iterator iterator() {
		// TODO 自动生成的方法存根
		return new SIterator();
	}
	private class SIterator implements Iterator{
		private Node n;
		public SIterator(){
			this.n=head;
		}
		@Override
		public boolean hasNext() {
			// TODO 自动生成的方法存根
			return n.next!=null;
		}

		@Override
		public Object next() {
			// TODO 自动生成的方法存根
			n=n.next;
			return n.item;
		}
	}
}

栈的应用:

案例:

1、逆波兰表达式求值问题

题目描述:

中缀表达式: 中缀表达式就是我们平常生活中使用的表达式,例如: 1+3*2,2-(1+3) 等等,中缀表达式的特点是:二元运算符总 是置于两个操作数中间。 中缀表达式是人们最喜欢的表达式方式,因为简单,易懂。但是对于计算机来说就不是这样了,因为中缀表达式的 运算顺序不具有规律性。不同的运算符具有不同的优先级,如果计算机执行中缀表达式,需要解析表达式语义,做 大量的优先级相关操作。 逆波兰表达式 ( 后缀表达式 ) : 逆波兰表达式是波兰逻辑学家 J ・卢卡西维兹 (J ・ Lukasewicz) 于 1929 年首先提出的一种表达式的表示方法,后缀表 达式的特点:运算符总是放在跟它相关的操作数之后。

需求: 给定一个只包含加减乘除四种运算的逆波兰表达式的数组表示方式,求出该逆波兰表达式的结果。 分析: 1. 创建一个栈对象 stack 存储操作数 2. 从左往右遍历逆波兰表达式,得到每一个字符串 3. 判断该字符串是不是运算符,如果不是,把该该操作数压入 stack 栈中 4. 如果是运算符,则从 stack 栈中弹出两个操作数 o1 , o2 5. 使用该运算符计算 o1 和 o2 ,得到结果 result 6. 把该结果压入 stack 栈中 7. 遍历结束后,拿出栈中最终的结果返回

代码实现:

	public static void main(String[] args) {
//		中缀表达式3*(17-15)+18/6的逆波兰表达式如下
		String notation[]= {"3","17","15","-","*","18","6","/","+"};
		int result=caculate(notation);
		System.out.println("逆波兰表达式的结果为:"+result);
	}
	private static int caculate(String[] notation) {
//		创建一个栈对象stack存储操作数
		Stack stack=new Stack();
//		从左往右遍历逆波兰表达式,得到每一个字符串
		for(int i=0;i 
 

2.队列

队列是一种基于先进先出 (FIFO) 的数据结构,是一种只能在一端进行插入 , 在另一端进行删除操作的特殊线性表,它 按照先进先出的原则存储数据,先进入的数据,在读取数据时先读被读出来。

代码实现:

public class Queue implements Iterable{
//	首节点
	private Node head;
//	尾结点
	private Node last;
//	记录队列中元素个数
	private int N;
//	定义内部类
	private static class Node{
		T item;
		Node next;
		public Node(T item,Node next) {
			this.item=item;
			this.next=next;
		}
	}
//	构造方法
	public Queue(){
		head=new Node(null,null);
		last=null;
		N=0;
	}
//	判断队列元素是否为空
	public boolean isEmpty() {
		return N==0;
	}
//	返回队列中元素个数
	public int size() {
		return N;
	}
	//从队列中拿出一个元素
	public T dequeue() {
		if(isEmpty()) {
			return null;
		}
		
		Node oldfirst=head.next;
		head.next=oldfirst.next;
//		元素个数-1
		N--;
//		
		if(isEmpty()) {
			last=null;
		}
		
		return oldfirst.item;
	}
	//向队列中插入元素t
	public void enqueue(T t) {
		if(last==null) {
			last=new Node(t,null);
			head.next=last;
		}else {
			Node oldlast=last;
			last=new Node(t,null);
			oldlast.next=last;
		}
//		元素个数+1
		N++;
	}
	@Override
	public Iterator iterator() {
		return new QIterator();
	}
	private class QIterator implements Iterator{
		Node n;
		public QIterator() {
			n= head;
		}
		@Override
		public boolean hasNext() {
			
			return n.next!=null;
		}
		@Override
		public Object next() {
			n=n.next;
			return n.item;
		}	
	}
}

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

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

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