算法导论第十章-基本数据结构-Cpp代码实现

实现了3个基本的数据结构:栈,队列和双向链表。


basic_data_struct.h

#pragma once

/*************************************************
Author:董小歪
Date:2016-06-10
Description:算法导论第十章-基本数据结构-Cpp代码实现
**************************************************/

#ifndef BASIC_DATA_STRUCT_H
#define BASIC_DATA_STRUCT_H

#include <iostream>
#include <vector>

using namespace std;

//*************************************************栈*************************************************
template <typename T>
class MyStack
{
public:
	MyStack(unsigned _max_size);						//构造函数确定栈的大小
	inline bool stack_empty() { return p_top < 0; }		//是否为空栈
	bool push(T e);										//入栈
	bool pop();											//出栈
	T top();											//返回栈顶元素
	void print_data();									//打印所有栈内元素
private:
	vector<T> data;										//元素数组
	const unsigned max_size;							//栈的最大值
	int p_top;											//栈顶下标
};

template <typename T>
MyStack<T>::MyStack(unsigned _max_size) :max_size(_max_size), p_top(-1) //栈顶初始化为-1
{
	data.resize(_max_size);
}

template <typename T>
bool MyStack<T>::push(T e)
{
	if (p_top + 1 < max_size)  //开始犯了一个错误,这里不能用 (p_top < max_size - 1),因为max_size是unsigned的。可能会出现溢出
	{
		data[++p_top] = e;
		return true;
	}
	else
		return false;	
}

template <typename T>
bool MyStack<T>::pop()   
{
	if (stack_empty())
		return false;
	--p_top;     //弹出栈顶元素并不是真的清空,而是改变栈顶下标
	return true;
}

template <typename T>
T MyStack<T>::top()
{
	if (stack_empty())
		return 0;
	return data[p_top];
}

template <typename T>
void MyStack<T>::print_data()
{
	if (stack_empty())
		cout << "stack is empty!!!" << endl;
	else
	{
		for (int i = 0; i <= p_top; ++i)
			cout << data[i] << " ";
		cout << endl;
	}
}


//*************************************************队列*************************************************
template <typename T>
class MyQueue
{
public:
	MyQueue(unsigned _max_size);											//构造函数,必须指定队列大小
	inline bool queue_empty() { return tail == head; }						//是否队空
	inline bool queue_isfull() { return (tail + 1) % max_size == head; }	//是否队满
	bool enqueue(T e);														//元素入队
	bool dequeue();															//元素出队
	void print_data();														//打印队列元素
private:
	vector<T> data;				//元素
	int tail, head;				//头尾下标
	const unsigned max_size;	//队列最大元素个数
	int data_num;				//当前元素个数
};

template <typename T>
MyQueue<T>::MyQueue(unsigned _max_size) :max_size(_max_size + 1), tail(0), head(0), data_num(0)  
{
	data.resize(max_size);//这里是为了能同时判断队空和队满两种情况,所以要空一个位置出来。所以max_size = _max_size + 1
}

template <typename T>
bool MyQueue<T>::enqueue(T e)
{
	if (queue_isfull())
		return false;
	tail = (tail + 1) % max_size;
	data[tail] = e;
	++data_num;
	return true;
}

template <typename T>
bool MyQueue<T>::dequeue()
{
	if (queue_empty())
		return false;
	head = (head + 1) % max_size;
	--data_num;
	return true;
}

template <typename T>
void MyQueue<T>::print_data()
{
	for (int index = (head + 1) % max_size, i = 1; i <= data_num; ++i, index = (index + 1) % max_size)
		cout << data[index] << " ";
	cout << endl;
}

//*************************************************双向链表*************************************************

template <typename T>				//链表结点定义
struct ListNode {
	T key;
	ListNode<T>* prev;
	ListNode<T>* next;
	ListNode(T _key) :key(_key), prev(nullptr), next(nullptr) { }
};

template <typename T>
class MyList {
public:
	MyList() :head(nullptr) {}			//构造函数
	ListNode<T>* list_search(T key);	//元素搜索
	bool list_insert(T key);			//元素插入
	bool list_delete(T key);			//元素删除
	void print_list();					//打印元素
private:
	ListNode<T>* head;					//表头
};

template <typename T>
ListNode<T>* MyList<T>::list_search(T key)
{
	ListNode<T>* cur = head;
	while (cur && cur->key != key)
		cur = cur->next;
	return cur;					//如果不存在,则返回的是空指针
}

template <typename T>
bool MyList<T>::list_insert(T key)
{
	ListNode<T>* x = new ListNode<T>(key);
	if (head)
	{
		ListNode<T>* temp = head;
		x->next = temp;
		temp->prev = x;			//如果存在头元素,别忘了改变prev
	}
	head = x;
	return true;
}

template <typename T>
bool MyList<T>::list_delete(T key)
{
	if (head && head->key == key)  //如果删除的是头元素
	{
		head = head->next;
		head->prev = nullptr;
		return true;
	}
	ListNode<T>* find = list_search(key);
	if (!find)
		return false;
	else
	{
		if (find->next)						//如果不是链表尾,测需要改变删除结点下一结点的prev指针
			find->next->prev = find->prev;
		find->prev->next = find->next;		//因为已经排除了链表头的情况,所以prev肯定存在
		return true;
	}
}

template <typename T>
void MyList<T>::print_list()
{
	if (!head)
		cout << "List is empty!!!" << endl;
	else
	{
		ListNode<T>* cur = head;
		while (cur)
		{
			cout << cur->key << " ";
			cur = cur->next;
		}
		cout << endl;
	}
}

#endif //!BASIC_DATA_STRUCT_H

测试:


main_entrance.cpp

#include "basic_data_struct.h"

int main()
{
	
	cout << "创建栈对象,大小为5" << endl;
	MyStack<int> mystk(5);
	cout << "栈是否为空?" << boolalpha << mystk.stack_empty() << endl;
	cout << "栈内元素:";mystk.print_data();
	cout << "压入3" << endl;	mystk.push(3);
	cout << "栈是否为空?" << boolalpha << mystk.stack_empty() << endl;
	cout << "压入4" << endl;	mystk.push(4);
	cout << "压入2" << endl;	mystk.push(2);
	cout << "栈内元素:";mystk.print_data();
	cout << "压入1" << endl;	mystk.push(1);
	cout << "压入5" << endl;	mystk.push(5);
	cout << "栈内元素:";mystk.print_data();
	cout << "压入6" << endl;	mystk.push(6);
	cout << "栈内元素:";mystk.print_data();
	cout << "栈顶元素是:" << mystk.top() << endl;	
	cout << "弹出栈顶元素后:"; mystk.pop(); mystk.print_data();

	cout << endl << "创建队列对象,大小为5" << endl;
	MyQueue<int> myque(5);
	cout << "队列是否为空?" << boolalpha << myque.queue_empty() << endl;
	cout << "元素4入队" << endl;	myque.enqueue(4);
	cout << "队列是否为空?" << boolalpha << myque.queue_empty() << endl;
	cout << "元素2入队" << endl;	myque.enqueue(2);
	cout << "元素3入队" << endl;	myque.enqueue(3);
	cout << "队列内元素:";	myque.print_data();
	cout << "队列是否满?" << boolalpha << myque.queue_isfull() << endl;
	cout << "元素5入队" << endl;	myque.enqueue(5);
	cout << "元素7入队" << endl;	myque.enqueue(7);
	cout << "队列是否满?" << boolalpha << myque.queue_isfull() << endl;
	cout << "队列内元素:";	myque.print_data();
	cout << "元素11入队" << endl;	myque.enqueue(11);
	cout << "队列是否满?" << boolalpha << myque.queue_isfull() << endl;
	cout << "队列内元素:";	myque.print_data();
	cout << "元素出队" << endl;	myque.dequeue();
	cout << "队列内元素:";	myque.print_data();
	cout << "队列是否满?" << boolalpha << myque.queue_isfull() << endl;
	cout << "元素1入队" << endl;	myque.enqueue(1);
	cout << "队列是否满?" << boolalpha << myque.queue_isfull() << endl;
	cout << "队列内元素:";	myque.print_data();
	cout << "元素出队" << endl;	myque.dequeue();
	cout << "元素出队" << endl;	myque.dequeue();
	cout << "元素出队" << endl;	myque.dequeue();
	cout << "元素出队" << endl;	myque.dequeue();
	cout << "队列内元素:";	myque.print_data();
	cout << "元素出队" << endl;	myque.dequeue();
	cout << "队列是否为空?" << boolalpha << myque.queue_empty() << endl;
	

	cout << "创建链表" << endl; MyList<int> ml;
	cout << "当前元素:"; ml.print_list();	
	cout << "插入元素5:"; ml.list_insert(5); ml.print_list();	
	cout << "插入元素10:"; ml.list_insert(10); ml.print_list();
	cout << "插入元素20:"; ml.list_insert(20); ml.print_list();
	cout << "插入元素40:"; ml.list_insert(40); ml.print_list();
	cout << "搜索元素10:" << endl;
	if (ml.list_search(10))
		cout << "元素存在:" << ml.list_search(10)->key << endl;
	else
		cout << "元素不存在" << endl;
	
	cout << "搜索元素15:" << endl;
	if (ml.list_search(15))
		cout << "元素存在:" << ml.list_search(15)->key << endl;
	else
		cout << "元素不存在" << endl;

	cout << "删除元素10:"; ml.list_delete(10); ml.print_list();
	cout << "删除元素40:"; ml.list_delete(40); ml.print_list();
	cout << "删除元素5:"; ml.list_delete(5); ml.print_list();

	system("pause");
}

测试结果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值