用LinkedStack实现的双向链表,功能与DLink一致
就实现的难度来看:
addFirst,addLast,removeFirst,removeLast,next,preivous,hasNext,hasPrevious比DLink简单
但是insertBefore,insertAfter,removeBefore,removeAfter比较困难。
另外indexOf不易实现,没有做
class StackDLink {
private LinkedStack nextStack = new LinkedStack();
private LinkedStack previousStack = new LinkedStack();
private boolean direction = true;
private int length;
void addFirst(int value) {
turn(true);
nextStack.push(value);
length++;
}
void addLast(int value) {
turn(false);
previousStack.push(value);
length++;
}
int removeFirst() {
turn(true);
if(nextStack.isEmpty()) return -1;
length--;
return nextStack.pop();
}
int removeLast() {
turn(false);
if(previousStack.isEmpty()) return -1;
length--;
return previousStack.pop();
}
int getLength() {
return length;
}
boolean hasNext() {
return !nextStack.isEmpty();
}
int next() {
if(!direction)previousStack.push(nextStack.pop());
direction = true;
int result = nextStack.pop();
previousStack.push(result);
return result;
}
void resetBeforeFirst() {
turn(true);
}
boolean hasPrevious() {
return !previousStack.isEmpty();
}
int previous() {
if(direction) nextStack.push(previousStack.pop());
direction = false;
int result = previousStack.pop();
nextStack.push(result);
return result;
}
void resetAfterLast() {
turn(false);
}
int removeBefore() {
if(previousStack.isEmpty()) return -1;
if(!direction) {
length--;
return previousStack.pop();
} else {
int temp = previousStack.pop();
if(previousStack.isEmpty()) {
previousStack.push(temp);
return -1;
}
int result = previousStack.pop();
length--;
previousStack.push(temp);
return result;
}
}
int removeAfter() {
if(nextStack.isEmpty()) return -1;
if(direction) {
length--;
return nextStack.pop();
} else {
int temp = nextStack.pop();
if(nextStack.isEmpty()) {
nextStack.push(temp);
return -1;
}
int result = nextStack.pop();
length--;
nextStack.push(temp);
return result;
}
}
void insertBefore(int value) {
if(!direction || previousStack.isEmpty())previousStack.push(value);
else {
int temp = previousStack.pop();
previousStack.push(value);
previousStack.push(temp);
}
length++;
}
void insertAfter(int value) {
if(direction || nextStack.isEmpty())nextStack.push(value);
else {
int temp = nextStack.pop();
nextStack.push(value);
nextStack.push(temp);
}
length++;
}
private void turn(boolean direction) {
if(direction) {
while(!previousStack.isEmpty()) {
nextStack.push(previousStack.pop());
}
} else {
while(!nextStack.isEmpty()) {
previousStack.push(nextStack.pop());
}
}
this.direction = direction;
}
}
分享到:
相关推荐
在C++编程中,双向链表是一种非常重要的数据结构,它允许在列表的任一位置进行插入和删除操作,而不必像数组那样依赖于索引。在这个“支持类模版的C++双向链表”中,我们将探讨如何利用C++的模板特性来实现一个灵活...
### Linux内核双向链表简单分析 #### 链表数据结构简介 链表作为一种基本且重要的数据结构,在操作系统及各种软件系统中扮演着至关重要的角色。尤其在Linux内核中,链表更是广泛应用于内存管理、进程调度、文件...
双向链表是一种特殊类型的数据结构,与常见的单向链表相比,它具有更丰富的操作能力,可以支持前后两个方向的遍历。本篇文章将深入探讨如何创建双向链表以及其在增加和删除操作中的应用。 双向链表的每个节点不仅...
本话题主要探讨两种常用的数据结构——单链表和双向链表在Java中的实现,以及相关的操作,如在头部添加节点、在尾部添加节点、遍历、逆置和删除。 首先,我们来理解单链表和双向链表的基本概念。单链表是一种线性...
双向链表是一种特殊的数据结构,它在编程中具有重要的应用。本文将深入探讨双向链表的概念,实现,以及如何进行基本操作。 双向链表,顾名思义,是一种链式存储结构,其中每个节点包含两个指针,一个指向前一个节点...
在这个特定的项目中,“C++双向链表统计文章单词出现频率”是一个涉及数据结构和算法的应用,目标是实现一个程序来分析文本文件,计算并显示文章中每个单词出现的次数。双向链表作为数据结构的核心,其特点是每个...
### 数据结构源代码之双向链表 #### 概述 本文档主要介绍如何通过C语言实现双向链表的基本操作。继单链表之后,双向链表作为一种更灵活的数据结构,支持从前向后以及从后向前的遍历。双向链表在每个节点中除了包含...
操作系统课程设计中实现线程安全的双向链表是一项重要的实践任务,这涉及到多线程编程、数据结构以及并发控制等核心知识点。在这个项目中,我们主要关注如何在多线程环境下构建一个能够正确操作(如插入、删除)而不...
双向链表的操作问题 Time Limit: 1000MS Memory Limit: 10000KB Submissions: 111 Accepted: 41 Description 建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成...
双向链表(Double Linked List)是链表的一种变体,它允许我们在列表中的每个节点处进行前向和后向的遍历。本文将详细探讨如何实现双向链表的增、删、改、查操作,并通过C++编程语言的DLink.cpp文件进行实际应用。 ...
双向链表是一种特殊的数据结构,它在计算机程序设计中扮演着重要角色,特别是在C++这样的编程语言中。本节将深入探讨双向链表的概念、其结构、操作以及C++中的实现。 双向链表与单链表不同,它允许每个节点不仅有一...
双向链表类定义及测试文件 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
在这个项目中,我们讨论的是如何在STM32F103上实现一个双向链表的数据结构。双向链表是一种特殊的数据结构,它允许我们在列表中的节点之间进行前向和后向的移动,这在处理动态数据集合时非常有用。 首先,我们要...
双向链表是一种高级数据结构,它在计算机科学中被广泛应用于各种算法和程序设计中。与单链表相比,双向链表的主要特点是每个节点不仅包含指向下一个节点的指针,还包含一个指向前一个节点的指针。这种设计使得双向...
### C++经典算法:双向链表 在计算机科学领域中,数据结构是极其重要的基础知识之一。其中链表作为一种常见的线性表实现方式,在各种应用场景中都有广泛的应用。本篇文章将根据给定的代码片段深入探讨双向链表的...
在编程领域,双向链表是一种数据结构,它允许在列表中的元素之间进行前向和后向的导航。这种数据结构在处理需要频繁插入、删除或遍历操作的问题时特别有用。而“n的阶乘”是数学概念,表示1到n的所有整数的乘积,记...
在编程领域,双向链表是一种重要的数据结构,它在C++中被广泛使用。与单向链表不同,双向链表允许元素在正向和反向两个方向上进行遍历,这为程序员提供了更大的灵活性。这里我们将深入探讨网上搜集的七种双向链表...
双向链表是一种特殊的链表,其中每个节点不仅包含指向下一个节点的指针(后继指针),还包含一个指向前一个节点的指针(前驱指针)。这种结构允许我们从两个方向遍历链表,即向前和向后。相比于单链表,双向链表在...
本主题聚焦于如何使用双向链表这一数据结构来实现大数阶乘的计算。双向链表允许我们有效地存储和操作大数,同时保持良好的性能。 首先,我们需要了解双向链表的基本概念。双向链表是一种线性数据结构,其中每个节点...