C++实现链表模板、链表栈模板、数组栈模板

本文介绍了如何使用C++实现链表模板和链表栈模板,以及数组栈模板。通过头文件和源文件的详细讲解,展示了从基础的链表结构到栈数据结构的模板化实现过程,并对比了数组栈和链表栈的特性。
摘要由CSDN通过智能技术生成

数组栈来自于上一篇文章(头文件1、2,源文件1、2)
1、实现链表模板
2、创建链表栈模板
3、比较数组栈和链表栈

1. 头文件1

Array.h

#pragma once
template<typename T>
class Array
{
public:
	Array(int capacity);
	Array();
	T& operator[](int i);

	int GetSize();
	int GetCapacity();
	bool IsEmpty();

	void add(int index, T e);


	void AddLast(T e);
	void AddFirst(T e);
	void toString();
	int get(T index);
	void set(int index, T e);
	bool contains(T e);
	int find(T e);
	//删除并返回
	T remove(int index);
	T removeFirst();
	T removeLast();
	void removeelement(T e);
	T GetLast();
	T GetFirst();
	~Array();

private:
	void reSize(int newcapacity);
protected:

private:
	int size;
	T *data;
	int capacity;
};


2. 头文件2

ArrayStack.h

#pragma once
#include "Array.h"
#include "StackInterface.h"
template<typename T>
class ArrayStack:public Stack<T>
{
public:
	ArrayStack(int capacity);
	ArrayStack();
	int GetSize();
	bool IsEmpty();
	int getcapacity();
	void Push(T e);
	T pop();
	T peek();
	void toString();
	~ArrayStack();
private:
	Array<T> array;
};


3. 头文件3

LinkListStack.h

#pragma once
#include "StackInterface.h"
#include "LinkList.hpp"
template<typename T>
class LinkListStack:public Stack<T>
{
public:
	LinkListStack();
	int GetSize();
	bool IsEmpty();
	void Push(T e);
	T pop();
	T peek();
	void toString();
	~LinkListStack();

private:
	LinkList<T> list;
};


4. 头文件4

StackInterface.h

#pragma once
template<typename T>
class Stack {
public:
	virtual int GetSize() = 0;
	virtual bool IsEmpty() = 0;
	virtual void Push(T e) = 0;
	virtual T pop() = 0;
	virtual T peek() = 0;
};

5. 源文件1

Array.hpp

#pragma once
#include "Array.h"
#include <string>
#include <iostream>
using namespace std;
template<typename T>
Array<T>::Array(int capacity) {
	cout << "Array(int)" << endl;
	data = new T[capacity];
	size = 0;
	this->capacity = capacity;
}
template<typename T>
Array<T>::Array() {
	cout << "Array()" << endl;
	this->capacity = 5;
	data = new T[capacity];
	size = 0;
}
template<typename T>
T& Array<T>::operator[](int i) {
	return data[i];
}
template<typename T>
int Array<T>::GetSize() {
	return size;
}
template<typename T>
int Array<T>::GetCapacity() {
	return capacity;
}
template<typename T>
bool  Array<T>::IsEmpty() {
	return size == 0;
}
template<typename T>
void Array<T>::add(int index, T e) {
	if (size == capacity) {
/*
		cout << "array is full,resize?(YorN)" << endl;
		char tmp;
		cin >> tmp;
		if (tmp == 'Y')
		{
			reSize(this->capacity * 2);
		}
		else
		{
			throw "array is full";
		}*/
		reSize(this->capacity * 2);
	}
	if (index<0 || index>size) {
		throw "add::index<0 || index>size";
	}
	for (int i = size - 1; i >= index; i--) {
		data[i + 1] = data[i];
	}
	data[index] = e;
	size++;
}

template<typename T>
void Array<T>::AddLast(T e) {
	add(size, e);
}
template<typename T>
void Array<T>::AddFirst(T e) {
	add(0, e);
}
template<typename T>
void Array<T>::toString() {
	cout << "Array Size =" << size << ",Capacity=" << capacity << endl;
	for (int i = 0; i < size; i++) {
		cout << *(data + i);
		if (i != size - 1) {
			cout << ",";
		}
	}
}
template<typename T>
int Array<T>::get(T index) {
	if (index<0 || index>size) {
		throw "get::index<0 || index>size";
	}
	return data[index];
}
template<typename T>
void Array<T>::set(int index, T e) {
	if (index<0 || index>size) {
		throw "set::index<0 || index>size";
	}
	data[index] = e;
}
template<typename T>
bool Array<T>::contains(T e) {
	for (int i = 0; i < size; i++) {
		if (data[i] == e) {
			return true;
		}
	}
	return false;
}
template<typename T>
int Array<T>::find(T e) {
	for (int i = 0; i < size; i++) {
		if (data[i] == e) {
			return i;
		}
	}
	return -1;
}
//删除并返回
template<typename T>
T Array<T>::remove(int index) {
	if (index<0 || index>size) {
		throw "remove::index<0 || index>size";
	}
	int ret = data[index];
	for (int i = index + 1; i < size; i++) {
		data[i - 1] = data[i];
	}
	size--;
	data[size] = NULL;
	if (size == capacity / 4 && this->capacity / 2 != 0)
	{
		reSize(this->capacity / 2);
	}
	return ret;
}
template<typename T>
T Array<T>::removeFirst() {
	return remove(0);
}
template<typename T>
T Array<T>::removeLast() {
	return remove(size - 1);
}

template<typename T>
void Array<T>::removeelement(T e) {
	int index = find(e);
	if (index != -1) {
		remove(index);
	}
}
template<typename T>
T Array<T>::GetLast() {
	return get(size - 1);
};
template<typename T>
T Array<T>::GetFirst() {
	return get(0);
};

template<typename T>
Array<T>::~Array() {
	if (data != NULL) {
       delete[] data;
	   data = NULL;
	}
	cout << "~Array()" << endl;
	//system("pause");
}
template<typename T>
void Array<T>::reSize(int newcapacity) {
	/*
	T* tmp = new T[this->capacity];
	for (int i = 0; i < size; i++) {
	tmp[i] = data[i];
	}
	this->capacity = newcapacity;
	data= new T[newcapacity];
	for (int i = 0; i < size; i++) {
	data[i] = tmp[i];
	}
	delete[] tmp;*/
	T* newdata = new T[newcapacity];
	for (int i = 0; i < size; i++) {
		newdata[i] = data[i];
	}
	data = newdata;
	this->capacity = newcapacity;
}


6. 源文件2

ArrayStack.hpp

#pragma once
#include "ArrayStack.h"
#include "Array.hpp"


template<typename T>
ArrayStack<T>::ArrayStack(int capacity){
	cout << "ArrayStack(int)" << endl;
	Array<T> array =Array<T>(capacity);
}
template<typename T>
ArrayStack<T>::ArrayStack() {
	cout << "ArrayStack()" << endl;
}
template<typename T>
int ArrayStack<T>::GetSize() {
	return array.GetSize();
}
template<typename T>
bool ArrayStack<T>::IsEmpty() {
	return array.IsEmpty();
}
template<typename T>
int ArrayStack<T>::getcapacity() {
	return array.GetCapacity();
}
template<typename T>
void ArrayStack<T>::Push(T e) {
	array.AddLast(e);
}
template<typename T>
T ArrayStack<T>::pop() {
	return array.removeLast();
}
template<typename T>
T ArrayStack<T>::peek() {
	return array.GetLast();
}

template<typename T>
void ArrayStack<T>::toString() {
	cout << "Stack:";
	for (int i = 0; i < array.GetSize(); i++) {
		cout << array.get(i) << ",";
	}
	cout << "top"<<endl;

}
template<typename T>
ArrayStack<T>::~ArrayStack() {
	cout << "~ArrayStack()" << endl;
	//system("pause");
}

7. 源文件3

LinkList.hpp

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<iostream>
using namespace std;
template<class T>
class  Node
{
public:
	Node(T e, Node* next) {
		this->data = e;
		this->next = next;
	}
	Node(T e) {
		this->data = e;
		this->next = NULL;
	}
	Node() {
		this->data = NULL;
		this->next = NULL;
	}
	T data;
	Node* next;
};

template<class T>
class  LinkList
{
public:
	LinkList() {
		virhead = new Node<T>(NULL,NULL);
		size = 0;
	}
	int GetSize() {
		return size;
	}

	bool IsEmpty() {
		return size == 0;
	}

	void add(int index,T e) {
		if (index<0 || index>size) {
			throw("index<0 || index>size");
			return;
		}
		else
		{
			Node<T>* prev = virhead;
			for (int i = 0; i < index; i++) {
				prev = prev->next;
			}
/*
			Node newnode = new Node(e);
			newnode->next = prev->next;
			prev->next = newnode;*/
			prev->next = new Node<T>(e, prev->next);
			size++;
		}
	} 
	void addFirst(T e) {
		add(0, e);
	}
	void addLast(T e) {
		add(size, e);
	}
	T Get(int index) {
		if (index<0 || index>size) {
			throw("index<0 || index>size");
			return NULL;
		}
		Node<T>* cur = virhead->next;
		for (int i = 0; i < index; i++) {
			cur = cur->next;
		}
		return cur->data;
	}
	T GetFirst() {
		return Get(0);
	}
	T GetLast() {
		return Get(size-1);
	}
	void set(int index, T e) {
		if (index<0 || index>size) {
			throw("index<0 || index>size");
			return;
		}
		Node<T>* cur = virhead->next;
		for (int i = 0; i < index; i++) {
			cur = cur->next;
		}
		cur->data=e;
	}
	bool Contain(T e) {
		Node<T>* cur = virhead;
		while (cur != NULL) {
			if (cur->data == e) {
				return true;
			}
			return false;
		}
	}
	void toString() {
		cout << "LinkList:" << endl;
		for (Node<T>* cur = virhead->next; cur != NULL;cur=cur->next) {
			cout << cur->data << "->";
		}
		cout << "NULL" << endl;
	}
	T RemoveIndex(int index) {
		if (index<0 || index>size) {
			throw("index<0 || index>size");
			return NULL;
		}
		Node<T>* prev = virhead;
		for (int i = 0; i < index; i++) {
			prev = prev->next;
		}
		Node<T>* newnode = prev->next;
		prev->next = newnode->next;
		newnode->next= NULL;
		size--;
		return newnode->data;
	}
	T RemoveFirst() {
		return RemoveIndex(0);
	}
	T RemoveLast() {
		return RemoveIndex(size-1);
	}


protected:

private:
	Node<T>* virhead;
	int size;
};



8. 源文件4

LinkListStack.hpp

#pragma once
#include "LinkList.hpp"
#include "LinkListStack.h"

template<typename T>
LinkListStack<T>::LinkListStack() {
	cout << "LinkListStack()" << endl;
}
template<typename T>
int LinkListStack<T>::GetSize() {
	return list.GetSize();
}
template<typename T>
bool LinkListStack<T>::IsEmpty() {
	return list.IsEmpty();
}

template<typename T>
void LinkListStack<T>::Push(T e) {
	list.addFirst(e);
}
template<typename T>
T LinkListStack<T>::pop() {
	return list.RemoveFirst();
}
template<typename T>
T LinkListStack<T>::peek() {
	return list.GetFirst();
}

template<typename T>
void LinkListStack<T>::toString() {
	cout << "Stack:top"<<endl;
	for (int i = 0; i < list.GetSize(); i++) {
		cout << list.Get(i) << "->";
	}
	cout  <<"NULL"<< endl;

}
template<typename T>
LinkListStack<T>::~LinkListStack() {
	cout << "~LinkListStack()" << endl;
	//system("pause");
}

9. 主程序

xxx.cpp

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include <string>
#include<windows.h>  
#include<time.h>  
#include "LinkListStack.hpp"
#include "ArrayStack.hpp"
#include "StackInterface.h"
#include "LinkList.hpp"
using namespace std;

void testtime(Stack<int>*q, int count) {
	srand((unsigned)time(NULL));
	LARGE_INTEGER t1, t2, tc;
	QueryPerformanceFrequency(&tc);
	QueryPerformanceCounter(&t1);
	for (int i = 0; i < count; i++) {
		q->Push(rand());
	}
	for (int i = 0; i < count; i++) {
		q->pop();
	}
	QueryPerformanceCounter(&t2);
	printf("Use Time:%f\n", (t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart);
}



int main(void)
{
	//链表测试
	LinkList<int> myll = LinkList<int>();
	for (int i = 0; i < 5; i++) {
		myll.addFirst(i);
		myll.toString();
	}
	myll.add(2, 11111);
	myll.toString();

	myll.RemoveIndex(2);
	myll.toString(); 
	myll.RemoveFirst();
	myll.toString();
	myll.RemoveLast();
	myll.toString();
	//链表栈测试
	LinkListStack<int> mylls = LinkListStack<int>();
	for (int i = 0; i < 5; i++) {
		mylls.Push(i);
		mylls.toString();
	}
	mylls.pop();
	mylls.toString();

	//性能测试
	int count = 10000000;
	ArrayStack<int> arrs = ArrayStack<int>();
	LinkListStack<int> lls = LinkListStack<int>();
	testtime(&arrs, count);
	testtime(&lls, count);


	system("pause");
	return 0;
}
面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值