ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

背包、队列和栈的实现(基于链表)

2022-01-31 23:31:39  阅读:181  来源: 互联网

标签:Node 背包 return 队列 private 链表 item public first


下面介绍背包、队列和栈(基于链表)的实现,是对《算法(第四版)》1.3 节的部分总结。

首先,应该知道链表及链表的基本操作,在 Java 链表中做了总结,下面主要是给出具体的实现代码。

栈的实现

算法 1 将栈保存为一条链表,栈的顶部即为表头,实例变量 first 指向栈顶。

算法 1 栈的实现(基于链表)
import java.util.Iterator;
public class Stack<Item> implements Iterable<Item>
{
	private Node first; // 栈顶(最近添加的元素)
	private int N;      // 元素数量
	private class Node
	{	// 定义了结点的嵌套类
		Item item;
		Node next;
	}
	public boolean isEmpty() {  return first == null; }  // 或:N == 0
	public int size()        {  return N; }
	public void push(Item item)
	{	// 向栈顶添加元素
		Node oldfirst = first;
		first = new Node();
		first.item = item;
		first.next = oldfirst;
		N++;
	}
	public Item pop()
	{	//从栈顶删除元素
		Item item = first.item;
		first = first.next;
		N--;
		return item;
	}
	public Iterator<Item> iterator() { return new StackIterator(); }
	private class StackIterator implements Iterator<Item> {
		private Node current = first;
		public boolean hasNext() { return current != null; }
		public Item next() {
			Item item = current.item;
			current = current.next;
			return item;
		}
	}
	public static void main(String[] args) {
		Stack<String> stack = new Stack<String>();
		while (!StdIn.isEmpty()) {
			String item = StdIn.readString();
			if (!item.equals("-")) stack.push(item);
			else if (!stack.isEmpty()) StdIn.print(stack.pop() + " ");
		}
		StdIn.println("(" + stack.size() + " left on stack)");
	}
}
img
图 1 测试 Stack

图 2 显示了图 1 中测试的轨迹。

img
图 2 Stack 的测试轨迹

队列的实现

算法 2 将队列表示为一条从最早插入的元素到最近插入的元素的链表,实例变量 first 指向队列的开头,实例变量 last 指向队列的结尾。

算法 2 队列的实现(基于链表)
import java.util.Iterator;
public class Queue<Item> implements Iterable<Item>
{
	private Node first; // 指向最早添加的结点的链接
	private Node last;  // 指向最近添加的结点的链接
	private int N;      // 队列中的元素数量
	private class Node
	{	// 定义了结点的嵌套类
		Item item;
		Node next;
	}
	public boolean isEmpty() {  return first == null;  }  // 或: N == 0.
	public int size()        {  return N;  }
	public void enqueue(Item item)
	{	// 向表尾添加元素
		Node oldlast = last;
		last = new Node();
		last.item = item;
		last.next = null;
		if (isEmpty()) first = last;
		else    oldlast.next = last;
		N++;
	}
	public Item dequeue()
	{	// 从表头删除元素
		Item item = first.item;
		first = first.next;
		if (isEmpty()) last = null;
		N--;
		return item;
	}
	public Iterator<Item> iterator() { return new QueueIterator(first); }
	private class QueueIterator implements Iterator<Item> {
		private Node current;
		public QueueIterator(Node first) { current = first; }
		public boolean hasNext() { return current != null; }
		public Item next() {
			if (!hasNext()) return null;
			Item item = current.item;
			current = current.next;
			return item;
		}
	}
	public static void main(String[] args) {
		Queue<String> queue = new Queue<String>();
		while (!StdIn.isEmpty()) {
			String item = StdIn.readString();
			if (!item.equals("-"))
				queue.enqueue(item);
			else if (!queue.isEmpty())
				StdIn.print(queue.dequeue() + " ");
		}
		StdIn.println("(" + queue.size() + " left on queue)");
    }
}
img
图 3 测试 Queue

图 4 显示了图 3 中测试的轨迹。

img
图 4 Queue 的测试轨迹

背包的实现

用链表数据结构实现我们的 Bag API 只需要将 Stack 中的 push() 改名为 add(),并去掉 pop() 的实现即可,如算法 1.4 所示(也可以用相同的方法实现 Queue,但需要的代码更多)。

import java.util.Iterator;
public class Bag<Item> implements Iterable<Item>
{
	private Node first; //链表的首结点
	private int N;      // 元素数量
	private class Node
	{
		Item item;
		Node next;
	}
	public boolean isEmpty() {  return first == null; }  // 或:N == 0
	public int size()        {  return N; }
	public void add(Item item)
	{	// 和 Stack 的 push() 方法完全相同
		Node oldfirst = first;
		first = new Node();
		first.item = item;
		first.next = oldfirst;
	}
	public Iterator<Item> iterator()
	{  return new ListIterator();  }
	private class ListIterator implements Iterator<Item>
	{
		private Node current = first;
		public boolean hasNext()
		{  return current ! = null;  }
		public void remove() { }
		public Item next()
		{
			Item item = current.item;
			current = current.next;
			return item;
		}
	}
}

标签:Node,背包,return,队列,private,链表,item,public,first
来源: https://www.cnblogs.com/Higurashi-kagome/p/15858717.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有