以下是本人学习中写的一个简单的链表和棧以及队列的实现,由于时间问题没有注释,但命名都很直观.
#include <iostream>
using namespace std;
#include <string>
typedef double T;
/*
单向链表类
*/
class List
{
struct Node
{
T data;
Node* next;
Node(const T& t=T()):data(t),next(NULL){}
};
Node* head;
public :
List():head(NULL){}
void clear()
{
while(head!=NULL)
{
Node* q=head->next;
delete head;
head=q;
}
}
~List()
{
clear();
}
void insert_front(const T& t)
{
Node* p=new Node(t);
p->next=head;
head=p;
}
void insert_back(const T& t)
{
Node* p=new Node(t);
Node* q=head;
if(head==NULL)
head=p;
else{
while(q->next!=NULL)
q=q->next;
q->next=p;
}
}
void travel()
{
Node* p=head;
while(p!=NULL)
{
cout<<p->data<<' ';
p=p->next;
}
cout<<endl;
}
int size()
{
int cnt=0;
Node* p=head;
while(p!=NULL)
{
cnt++;
p=p->next;
}
return cnt;
}
T getHead()
{
if(head==NULL)
throw "no head !";
return head->data;
}
T getTail()
{
if(head==NULL) throw "no tail !";
Node* p=head;
while(p->next!=NULL)
{
p=p->next;
}
return p->data;
}
bool empty()
{
return head==NULL;
}
int find(const T& t)
{
Node* p=head;
int pos=0;
while(p!=NULL)
{
if(p->data==t)
return pos;
p=p->next;
pos++;
}
return -1;
}
bool update(const T& o,const T& n)
{
int pos=find(0);
if(pos==-1)
return false;
Node* p=getPointer(pos);
p->data=n;
return true;
}
private :
Node* getPointer(int pos)
{
Node* p=head;
for(int i=0;i<pos;i++)
{
p=p->next;
}
return p;
}
public :
bool erase(const T& t)
{
int pos=find(t);
if(pos==-1)
return false;
if(pos==0)
{
Node* q=head->next;
delete head;
head=q;
}else{
Node* pre=getPointer(pos-1);
Node* cur=pre->next;
pre->next=cur->next;
delete cur;
}
return true;
}
};
/*
栈类
*/
class Stack
{
List l;
public :
void push(const T& t)
{
l.insert_front(t);
}
void pop()
{
l.erase(l.getHead());
}
T top()
{
return l.getHead();
}
bool empty()
{
return l.empty();
}
int size()
{
return l.size();
}
void clear()
{
l.clear();
}
};
/*
队列类
*/
class Queue
{
List l;
public :
void push(const T& t)
{
l.insert_back(t);
}
void pop()
{
l.erase(l.getHead());
}
T front()
{
return l.getHead();
}
T back()
{
return l.getTail();
}
bool empty()
{
return l.empty();
}
int size()
{
return l.size();
}
void clear()
{
l.clear();
}
};
void main()
{
//自己的测试代码
}
很多不足之处正在慢慢探索学习中。
分享到:
相关推荐
链表分为单向链表、双向链表和循环链表等类型。在List.cpp文件中,可能包含了链表的创建、插入、删除、遍历等操作的实现。例如,你可以找到关于头插法、尾插法、查找特定节点以及反转链表的C++代码。 栈是一种后进...
这里我们将探讨标题和描述中提到的四种数据结构:表、链表、栈和队列,并结合源代码的学习来理解它们。 1. **表**(Array):表是最基础的数据结构,它是一个固定大小的数组,用于存储同类型的数据。在C语言中,...
链表分为单向链表、双向链表和循环链表等类型,本程序可能使用的是单向链表,因为队列和栈通常只需要头尾操作,不需要双向访问。 队列是一种先进先出(FIFO,First In First Out)的数据结构,类似于现实生活中的...
在某些场景下,链表栈和链表队列相比数组实现的栈和队列,能更好地处理动态变化的大小需求。 在实际编程中,我们可能需要对这些数据结构进行优化,例如,循环链表可以避免空指针问题,提高效率;链表栈和链表队列...
在单向链表中,节点只能向前指向下一个节点;而在双向链表中,节点可以向前也可以向后指。此外,循环链表是链表的一种变体,最后一个节点指向第一个节点,形成一个环。 栈是一种“后进先出”(LIFO)的数据结构,常...
每个元素称为节点,包含数据和指向下一个节点的引用。链表分为单向链表、双向链表和环形链表等类型。在CIR_LK_LIST目录中,可能包含了这些链表的实现,例如插入、删除、查找等操作。 2. **栈**: 栈是一种后进先出...
假定一个单向循环链表来表示队列
在单向链表中,每个节点只能向前指向一个节点;双向链表则允许节点同时向前和向后指;循环链表的最后一个节点会指向列表的第一个节点,形成一个环。链表的主要操作包括插入、删除和遍历。在C语言中,实现链表通常...
每个元素称为节点,包含数据和指向下一个节点的引用。链表主要有单向链表和双向链表两种类型。单向链表只能向前遍历,而双向链表则可以向前或向后遍历。链表的主要操作包括插入、删除和查找。在C语言中,通过指针...
单向链表在各种数据结构(如栈、队列、哈希表)以及算法(如LRU缓存淘汰策略)中都有应用。例如,链表可以用来实现动态分配内存的内存池,或者作为操作系统中的进程控制块链表。 总结,单向链表是数据结构的基础,...
链表分为单向链表、双向链表和循环链表等类型,它们各有优缺点,如单向链表插入和删除操作相对简便,但访问元素不如数组直接。 栈是一种后进先出(LIFO)的数据结构,常被比喻为一个堆叠的盘子。栈的操作主要包括压...
在实际应用中,单向链表常用于实现各种数据结构,如栈、队列和图。其优势在于插入和删除操作只需要O(1)的时间复杂度,因为它们不涉及元素的移动。然而,查找操作(特别是按索引查找)效率较低,因为链表无法提供随机...
链表由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单向链表和双向链表。在单向链表中,节点只能向前遍历;而在双向链表中,节点可以向前也可以向后遍历。C语言中,链表通常通过定义结构体来...
单向链表常用于实现数据结构如栈和队列,缓存管理,以及当频繁的插入和删除操作远多于查找操作时的情况。 总结,C#中的单向链表通过`LinkedList<T>`类提供了丰富的操作,同时也可以通过自定义节点和链表类理解其...
在这个名为"单向链表实现的叫号程序"的案例中,我们可以通过分析`CallNum.java`文件来理解如何利用单向链表来实现一个简单的财务叫号系统。 首先,单向链表不像数组那样有一个连续的内存空间,它的每个元素(节点)...
链表分为单向链表、双向链表和循环链表等类型。链表的主要操作有插入、删除和遍历。链表在处理动态数据集合时特别有用,因为它们不需要预先确定大小,且插入和删除操作通常比数组快。 然后是队列(Queue),它是...
该队列的主要特点是其内部数据结构采用了一个单向链表,并且实现了 BlockingQueue 接口,提供了线程安全的插入、删除和获取元素的操作。 单向链表是一种简单的数据结构,由一系列节点组成,每个节点包含数据以及...
在实际编程中,链表还可以用于实现各种高级数据结构,如栈、队列和图等。同时,链表的操作如删除节点、查找节点、反转链表等也是面试和编程竞赛中常见的问题。理解和熟练掌握链表的这些基本操作对于提升编程技能至关...
顺序表、链表、栈、队列、树、Hashmap等数据结构;排序、二分法查找、树遍历等常见算法实现...单向链表 双向链表 单向循环链表 栈 队列 FIFO队列 LIFO队列 优先队列(Priority Queue) 双端队列(double-ended queue)
在本案例中,我们讨论的是一个单向链表的实现,这是一个基础且实用的数据结构。单向链表与双向链表不同,每个节点仅包含指向下一个节点的指针,而没有指向前一个节点的指针。 首先,让我们理解链表的基本概念。链表...