`
dixian
  • 浏览: 15713 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

单向链表、栈、队列

 
阅读更多

链表:

#ifndef LINKEDLIST_H_
#define LINKEDLIST_H_

#include <stdexcept>
using namespace std;

template<typename T>
class Node {
public:
	T element;
	Node<T> *next;

	Node() {
		next = NULL;
	}
	Node(T element) {
		this->element = element;
		next = NULL;
	}
};

//----------------- Iterator -----------------
template<typename T>
class Iterator {
public:
	Iterator(Node<T> *p) {
		current = p;
	}
	Iterator &operator++() {
		current = current->next;
		return *this;
	}
	Iterator &operator++(int) {
		return ++(*this);
	}
	T operator*() {
		return current->element;
	}
	bool operator==(const Iterator<T> &iterator) {
		return current == iterator.current;
	}
	bool operator!=(const Iterator<T> &iterator) {
		return current != iterator.current;
	}

private:
	Node<T> *current;
};
//----------------- Iterator -----------------

template<typename T>
class LinkedList {
public:
	LinkedList();
	void addFirst(T element);
	void addLast(T element);
	T getFirst();
	T getLast();
	T get(int index);
	T removeFirst() throw (runtime_error);
	T removeLast() throw (runtime_error);
	void add(T element);
	void add(int index, T element);
	void remove(T element);
	T removeAt(int index) throw (runtime_error);
	void clear();
	int getSize();
	bool isEmpty();

	//----------------- Iterator -----------------
	Iterator<T> begin();
	Iterator<T> end();
	//----------------- Iterator -----------------

private:
	Node<T> *head, *tail;
	int size;
};

template<typename T>
LinkedList<T>::LinkedList() {
	size = 0;
	head = tail = NULL;
}
template<typename T>
void LinkedList<T>::addFirst(T element) {
	Node<T> *newNode = new Node<T> (element);
	newNode->next = head;
	head = newNode;
	size++;
	if (tail == NULL)
		tail = head;
}
template<typename T>
void LinkedList<T>::addLast(T element) {
	if (tail == NULL)
		tail = head = new Node<T> (element);
	else {
		tail->next = new Node<T> (element);
		tail = tail->next;
	}
	size++;
}
template<typename T>
T LinkedList<T>::getFirst() {
	if (size == 0)
		throw runtime_error("Index out of range.");
	return head->element;
}
template<typename T>
T LinkedList<T>::getLast() {
	if (size == 0)
		throw runtime_error("Index out of range.");
	return tail->element;
}
template<typename T>
T LinkedList<T>::get(int index) {
	if (index < 0 || index > (size - 1))
		throw runtime_error("Index out of range.");
	else if (index == 0)
		return getFirst();
	else if (index == (size - 1))
		return getLast();
	else {
		Node<T> *current = head;
		for (int i = 0; i < index; i++)
			current = current->next;
		return current->element;
	}
}
template<typename T>
T LinkedList<T>::removeFirst() throw (runtime_error) {
	if (size == 0)
		throw runtime_error("No elements in the list.");
	Node<T> *temp = head;
	head = head->next;
	if (head == NULL)
		tail = NULL;
	size--;
	T element = temp->element;
	delete temp;
	return element;
}
template<typename T>
T LinkedList<T>::removeLast() throw (runtime_error) {
	if (size == 0)
		throw runtime_error("No elements in the list.");
	else if (size == 1) {
		Node<T> *temp = head;
		head = tail = NULL;
		size = 0;
		T element = temp->element;
		delete temp;
		return element;
	} else {
		Node<T> *current = head;
		for (int i = 0; i < size - 2; i++)
			current = current->next;
		Node<T> *temp = tail;
		tail = current;
		tail->next = NULL;
		size--;
		T element = temp->element;
		delete temp;
		return element;
	}
}
template<typename T>
void LinkedList<T>::add(T element) {
	addLast(element);
}
template<typename T>
void LinkedList<T>::add(int index, T element) {
	if (index == 0)
		addFirst(element);
	else if (index >= size)
		addLast(element);
	else {
		Node<T> *current = head;
		for (int i = 1; i < index; i++)
			current = current->next;
		Node<T> *temp = current->next;
		current->next = new Node<T> (element);
		(current->next)->next = temp;
		size++;
	}
}
template<typename T>
void LinkedList<T>::remove(T element) {

}
template<typename T>
T LinkedList<T>::removeAt(int index) throw (runtime_error) {
	if (index < 0 || index > (size - 1))
		throw runtime_error("Index out of range.");
	else if (index == 0)
		return removeFirst();
	else if (index == (size - 1))
		return removeLast();
	else {
		Node<T> *previous = head;
		for (int i = 1; i < index; i++)
			previous = previous->next;
		Node<T> *current = previous->next;
		previous->next = current->next;
		size--;
		T element = current->element;
		delete current;
		return element;
	}
}
template<typename T>
void LinkedList<T>::clear() {
	while (head != NULL) {
		Node<T> *temp = head;
		delete temp;
		head = head->next;
	}
	tail = NULL;
}
template<typename T>
int LinkedList<T>::getSize() {
	return size;
}
template<typename T>
bool LinkedList<T>::isEmpty() {
	return head == NULL;
}

//----------------- Iterator -----------------
template<typename T>
Iterator<T> LinkedList<T>::begin() {
	return Iterator<T> (head);
}
template<typename T>
Iterator<T> LinkedList<T>::end() {
	return Iterator<T> (tail->next);
}
//----------------- Iterator -----------------

#endif /* LINKEDLIST_H_ */
 

栈:

#ifndef STACKWITHLINKEDLIST_H_
#define STACKWITHLINKEDLIST_H_

#include "LinkedList.h"

template<typename T = int>
class Stack {
public:
	Stack();
	bool isEmpty();
	T peek();
	void push(T value);
	T pop();
	int getSize();

private:
	LinkedList<T> list;
};

template<typename T>
Stack<T>::Stack() {
}
template<typename T>
bool Stack<T>::isEmpty() {
	return list.isEmpty();
}
template<typename T>
T Stack<T>::peek() {
	return list.getLast();
}
template<typename T>
void Stack<T>::push(T value) {
	list.addLast(value);
}
template<typename T>
T Stack<T>::pop() {
	return list.removeLast();
}
template<typename T>
int Stack<T>::getSize() {
	return list.getSize();
}

#endif /* STACKWITHLINKEDLIST_H_ */
 

队列:

#ifndef QUEUE_H_
#define QUEUE_H_

#include "LinkedList.h"

using namespace std;

template<typename T>
class Queue {
public:
	Queue();
	void enqueue(T element);
	T dequeue() throw (runtime_error);
	int getSize();

private:
	LinkedList<T> list;
};

template<typename T>
Queue<T>::Queue() {
}
template<typename T>
void Queue<T>::enqueue(T element) {
	list.addLast(element);
}
template<typename T>
T Queue<T>::dequeue() throw (runtime_error) {
	return list.removeFirst();
}
template<typename T>
int Queue<T>::getSize() {
	return list.getSize();
}

#endif /* QUEUE_H_ */
 

 

分享到:
评论

相关推荐

    数据结构链表,队列,栈源代码

    链表分为单向链表和双向链表。在单向链表中,节点只能向前遍历;而在双向链表中,节点可以向前也可以向后遍历。C语言中,链表通常通过定义结构体来实现: ```c typedef struct Node { int data; struct Node* ...

    数据结构之链表栈与队列

    在某些场景下,链表栈和链表队列相比数组实现的栈和队列,能更好地处理动态变化的大小需求。 在实际编程中,我们可能需要对这些数据结构进行优化,例如,循环链表可以避免空指针问题,提高效率;链表栈和链表队列...

    数据结构的链表,队列,栈(c)

    链表有多种类型,如单向链表、双向链表和循环链表。在单向链表中,每个节点只能向前指向一个节点;双向链表则允许节点同时向前和向后指;循环链表的最后一个节点会指向列表的第一个节点,形成一个环。链表的主要操作...

    用链表实现队列栈 包括虚函数、指针

    链表分为单向链表、双向链表和循环链表等类型,本程序可能使用的是单向链表,因为队列和栈通常只需要头尾操作,不需要双向访问。 队列是一种先进先出(FIFO,First In First Out)的数据结构,类似于现实生活中的...

    数据结构(表,链表,栈,队列)的源代码

    单向链表只能按顺序访问,而双向链表支持前向和后向遍历。链表的优点在于可以灵活地添加和删除元素,但访问速度较慢,因为需要遍历到目标位置。 3. **栈**(Stack):栈是一种“后进先出”(LIFO)的数据结构。它的...

    链表,队列,二叉树的应用实现

    单向链表只能向前遍历,而双向链表则可以向前或向后遍历。链表的主要操作包括插入、删除和查找。在C语言中,通过指针操作来实现链表的这些操作,这在动态内存分配和数据存储上提供了很大的灵活性。 接下来是队列,...

    C#单向链表C#单向链表C#单向链表

    单向链表常用于实现数据结构如栈和队列,缓存管理,以及当频繁的插入和删除操作远多于查找操作时的情况。 总结,C#中的单向链表通过`LinkedList&lt;T&gt;`类提供了丰富的操作,同时也可以通过自定义节点和链表类理解其...

    LinkedBlockingQueue + 单向链表基本结构

    该队列的主要特点是其内部数据结构采用了一个单向链表,并且实现了 BlockingQueue 接口,提供了线程安全的插入、删除和获取元素的操作。 单向链表是一种简单的数据结构,由一系列节点组成,每个节点包含数据以及...

    数据结构中链表,栈和队列,串的算法实现代码

    链表分为单向链表、双向链表和循环链表等类型。在List.cpp文件中,可能包含了链表的创建、插入、删除、遍历等操作的实现。例如,你可以找到关于头插法、尾插法、查找特定节点以及反转链表的C++代码。 栈是一种后进...

    数据结构代码 栈 链表 队列

    链表分为单向链表、双向链表和循环链表等类型。链表的主要操作有插入、删除和遍历。链表在处理动态数据集合时特别有用,因为它们不需要预先确定大小,且插入和删除操作通常比数组快。 然后是队列(Queue),它是...

    单向链表实现

    单向链表在各种数据结构(如栈、队列、哈希表)以及算法(如LRU缓存淘汰策略)中都有应用。例如,链表可以用来实现动态分配内存的内存池,或者作为操作系统中的进程控制块链表。 总结,单向链表是数据结构的基础,...

    Python单向链表和双向链表原理与用法实例详解

    在Python中,我们可以自定义链表结构来实现单向链表和双向链表。 单向链表(Single Linked List)的特点是每个节点只包含一个指向下一个节点的引用。在单向链表中,遍历只能从头节点开始,按顺序访问每个节点,无法...

    数据结构与算法的学习:_稀疏数组、单向队列、环形队列、单向链表、双

    数据结构与算法的学习:_稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、_dataStructuresAndAlgorithm

    人工智能-项目实践-python-顺序表、链表、栈、队列、树、Hashmap等数据结构;排序、二分法查找、树遍历等常见算法实现

    顺序表、链表、栈、队列、树、Hashmap等数据结构;排序、二分法查找、树遍历等常见算法实现...单向链表 双向链表 单向循环链表 栈 队列 FIFO队列 LIFO队列 优先队列(Priority Queue) 双端队列(double-ended queue)

    链表、队列、栈、二叉树、哈希表等

    链表分为单向链表、双向链表和循环链表。单向链表只能向前遍历,而双向链表支持前向和后向遍历。链表的主要操作包括插入、删除和遍历。 2. **队列**:队列是一种先进先出(FIFO)的数据结构,类似于现实生活中的...

    算法大全-面试题-链表-栈-二叉树-数据结构

    链表分为单向链表、双向链表和循环链表等类型,它们各有优缺点,如单向链表插入和删除操作相对简便,但访问元素不如数组直接。 栈是一种后进先出(LIFO)的数据结构,常被比喻为一个堆叠的盘子。栈的操作主要包括压...

    lianbiao.rar_单向链表

    在实际应用中,单向链表常用于实现各种数据结构,如队列(先进先出,FIFO)、栈(后进先出,LIFO)和关联数组(哈希表)。单向链表还常常作为其他复杂数据结构的基础,例如双向链表、循环链表等。 在“数据结构实验...

    单向链表(一) 结构体、创建链表、遍历链表

    在实际编程中,链表还可以用于实现各种高级数据结构,如栈、队列和图等。同时,链表的操作如删除节点、查找节点、反转链表等也是面试和编程竞赛中常见的问题。理解和熟练掌握链表的这些基本操作对于提升编程技能至关...

    假定一个单向循环链表来表示队列

    假定一个单向循环链表来表示队列

Global site tag (gtag.js) - Google Analytics