基于双向链表的栈和队列实现
栈的实现:
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶(top),相对地,把另一端称为栈底(bottom)。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。
栈接口:
View Code
View Code

1 /** 2 * 描述栈的基本操作 3 */ 4 public interface IStack<T> { 5 /** 6 * 元素入栈 7 */ 8 void push(T e); 9 10 /** 11 * 弹出栈顶(栈中无此元素) 12 */ 13 T pop(); 14 15 /** 16 * 是否空栈 17 */ 18 boolean empty(); 19 20 /** 21 * 栈内元素个数 22 */ 23 int getSize(); 24 25 /** 26 * 查看栈顶元素,不弹出 27 */ 28 T peek(); 29 }
栈的实现:

1 import java.util.EmptyStackException; 2 3 // DoubleLinkedList ListNode 前面的博客已经介绍 4 public class MyStack<T> extends DoubleLinkedList<T> implements IStack<T> { 5 @Override 6 public void push(T e) { 7 super.add(e); 8 } 9 10 @Override 11 public T pop() { 12 if (size <= 0) 13 throw new EmptyStackException(); 14 ListNode<T> the = super.last.getPre(); 15 T res = the.getData(); 16 17 the.getPre().setNext(last); 18 last.setPre(the.getPre()); 19 the.setNext(null); 20 the.setPre(null); 21 size--; 22 return res; 23 } 24 25 @Override 26 public boolean empty() { 27 return getSize() == 0; 28 } 29 30 @Override 31 public int getSize() { 32 return super.getSize(); 33 } 34 35 @Override 36 public T peek() { 37 return last.getPre().getData(); 38 } 39 }
队列的实现:
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。队列结构与日常生活中排对等候服务的模型是一致的,最早进入队列的人,最早得到服务并从队首离开;最后到来的只能排在队列的最后,最后得到服务并最后离开。
队列接口:
View Code
View Code

1 /** 2 * 描述队列的基本操作 3 */ 4 public interface IQueue<T> { 5 // 入队 6 void enqueue(T e); 7 8 // 出队 9 T dequeue(); 10 11 // 返回队列的大小 12 int getSize(); 13 14 // 判断队列是否为空 15 boolean empty(); 16 17 // 取队首元素 18 T peek(); 19 }
队列的实现:

1 //DoubleLinkedList ListNode 前面的博客已经介绍 2 public class MyQueue<T> extends DoubleLinkedList<T> implements IQueue<T> { 3 @Override 4 public void enqueue(T e) { 5 super.add(e); 6 } 7 8 @Override 9 public T dequeue() { 10 ListNode<T> h = first.getNext(); 11 first.setNext(h.getNext()); 12 h.getNext().setPre(first); 13 h.setPre(null); 14 h.setNext(null); 15 size--; 16 return h.getData(); 17 } 18 19 @Override 20 public boolean empty() { 21 return getSize() == 0; 22 } 23 24 @Override 25 public T peek() { 26 return first.getNext().getData(); 27 } 28 }
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
本文来自博客园,作者:|旧市拾荒|,转载请注明原文链接:https://www.cnblogs.com/xiaoyh/p/10387048.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~