基于搜索二叉树的停车收费管理系统

系统效果:
录入汽车信息

查看汽车信息

收费信息查看

查询车库车辆

代码展示:

cpp 复制代码
//SearchBinaryTree.h
#pragma once
#include<iostream>
#include<string>
#include<time.h>
#include<Windows.h>
using namespace std;

template<class K, class V>
struct BSTNode
{
	K _key;
	V _value;
	BSTNode<K, V>* _left;
	BSTNode<K, V>* _right;
	BSTNode(const K& key,const V& value)
		:_key(key)
		,_value(value)
		,_left(nullptr)
		,_right(nullptr)
	{}
};

template<class K, class V>
class BSTree
{
	typedef BSTNode<K, V> Node;
public:

	BSTree()
		:_root(nullptr)
	{}

	~BSTree()
	{
		Destroy(_root);
		_root = nullptr;
	}

	bool Insert(const K& key, const V& value);
	bool Erase(const K& key);

	Node* Find(const K& key)
	{
		{
			Node* cur = _root;
			while (cur)
			{
				if (cur->_key < key)
				{
					cur = cur->_right;
				}
				else if (cur->_key > key)
				{
					cur = cur->_left;
				}
				else
				{
					return cur;
				}
			}
			return nullptr;
		}
	}

	void Destroy(Node* root)
	{
		if (root == nullptr)
			return;
		Destroy(root->_left);
		Destroy(root->_right);
		delete root;
	}

	void InOeder()
	{
		_InOeder(_root);
	}

private:
	void _InOeder(Node* root);

private:
	Node* _root;
};

template<class K, class V>
inline bool BSTree<K, V>::Insert(const K& key, const V& value)
{
	if (_root == nullptr)
	{
		_root = new Node(key, value);
		return true;
	}
	Node* parent = nullptr;
	Node* cur = _root;
	while (cur)
	{
		if (cur->_key < key)
		{
			parent = cur;
			cur = cur->_right;
		}
		else if (cur->_key > key)
		{
			parent = cur;
			cur = cur->_left;
		}
		else
		{
			return false;
		}
	}
	cur = new Node(key, value);
	if (parent->_key > cur->_key)
	{
		parent->_left = cur;
	}
	else if (parent->_key < cur->_key)
	{
		parent->_right = cur;
	}
	return true;
}


template<class K, class V>
inline bool BSTree<K, V>::Erase(const K& key)
{
		Node* cur = _root;
	Node* parent = nullptr;
	while (cur)
	{
		if (cur->_key < key)
		{
			parent = cur;
			cur = cur->_right;
		}
		else if (cur->_key > key)
		{
			parent = cur;
			cur = cur->_left;
		}
		else
		{
			if (cur->_left = nullptr)
			{
				if (parent == nullptr)
				{
					_root = cur->_right;
				}
				else
				{
					if (parent->_left == cur)
					{
						parent->_left = cur->_right;
					}
					else
					{
						parent->_right = cur->_right;
					}
				}
				delete cur;
				return true;
			}
			else if (cur->_right == nullptr)
			{
				if (parent == nullptr)
				{
					_root = cur->_left;
				}
				else
				{
					if (parent->_left == cur)
					{
						parent->_left = cur->_left;
					}
					else
					{
						parent->_right = cur->_left;
					}
				}
				delete cur;
				return true;
			}
			else
			{
				Node* rightMin = cur->_right;
				Node* rightMinParent = cur;
				while (rightMin->_left)
				{
					rightMinParent = rightMin;
					rightMin = rightMin->_left;
				}
				cur->_key = rightMin->_key;
				if(rightMinParent->_left == rightMin)
					rightMinParent->_left = rightMin->_right;
				else
					rightMinParent->_right = rightMin->_right;
				delete rightMin;
				return true;
			}
		}
	}
	return false;
}

template<class K, class V>
inline void BSTree<K, V>::_InOeder(Node* root)
{
		if (root == nullptr)
		return;
		_InOeder(root->_left);
		cout << "汽车车牌号:" << root->_key << " ";
		struct tm info;
		localtime_s(&info, &root->_value);
		char buffer2[80];
		strftime(buffer2, 80, "%Y-%m-%d %H:%M:%S", &info);
		cout << "入库的时间:" << buffer2 << endl;
		_InOeder(root->_right);
}
cpp 复制代码
//Parking_Fee.h
#pragma once
#include"SearchBinaryTree.h"

class ParFee
{
public:
	void menu();
	void entering();
	void Find();
	void Erase();
	void statistics();
	BSTree<string, time_t> par;
};
cpp 复制代码
//Parking_Fee.cpp
#include"SearchBinaryTree.h"
#include"Parking_Fee.h"

void ParFee::entering()
{
    time_t seconds = time(NULL);
    time_t curLocalTime;
    time(&curLocalTime);
    struct tm info;
    localtime_s(&info, &curLocalTime);
    char buffer2[80];
    strftime(buffer2, 80, "%Y-%m-%d %H:%M:%S", &info);
	cout << "请输入识别的汽车车牌号>:" << endl;
	string ID; cin >> ID;
	cout << "====>" << endl;
	Sleep(1000);
	cout << "=========>" << endl;
	Sleep(1000);
	cout << "=================>" << endl;
	Sleep(1000);
	cout << "录入成功" << endl;
	system("pause");
	system("cls");
	cout << "*-----------------------*" << endl;
	cout << "<<><>汽车车牌号:" << ID << endl;
	cout << "<<><>入库的时间:" << buffer2 << endl;
	cout << "*-----------------------*" << endl;
	par.Insert(ID, seconds);
    system("pause");
}

void ParFee::Find()
{
    cout << "<*请输入你要查询的车辆*>" << endl;
    string ID; cin >> ID;
    auto ret = par.Find(ID);
    if (ret)
     {
        cout << "<<><>汽车车牌号:" << ID << endl;
        struct tm info;
        localtime_s(&info, &ret->_value);
        char buffer2[80];
        strftime(buffer2, 80, "%Y-%m-%d %H:%M:%S", &info);
        cout << "<<><>入库的时间:" << buffer2 << endl;
     }
    else
     {
        cout << "无此汽车,请重新输入" << endl;
     }
    system("pause");
}

void ParFee::Erase()
{
    cout << "<*请输入将要离开的车辆*>" << endl;
    string ID; cin >> ID;
    auto ret = par.Find(ID);
    time_t  leave_seconds = time(NULL);
    time_t curLocalTime;
    time(&curLocalTime);
    struct tm info;
    localtime_s(&info, &curLocalTime);
    char buffer3[80];
    strftime(buffer3, 80, "%Y-%m-%d %H:%M:%S", &info);
    if (ret)
    {
        cout << "<<><>汽车车牌号:" << ID << endl;
        struct tm info;
        localtime_s(&info, &ret->_value);
        char buffer2[80];
        strftime(buffer2, 80, "%Y-%m-%d %H:%M:%S", &info);
        cout << "<<><>入库的时间:" << buffer2 << endl;
        cout << "<<><>离开的时间:" << buffer3 << endl;
        long long int course_timt = difftime(leave_seconds, ret->_value);
        int a, b, c;
        a = course_timt % 60;
        b = course_timt / 60 % 60;
        c = course_timt / 60 / 60;
        cout << ID << "车辆 停车花费时间为:" << c << " h " << b << " min " << a << " sec " << endl;
        cout << "需要收取费用:" << 20 * c << " 元" << endl;
    }
    else
    {
        cout << "无此汽车,请重新输入" << endl;
    }
    par.Erase(ID);
    system("pause");
}

void ParFee::statistics()
{
    par.InOeder();
    system("pause");
}



void ParFee::menu()
{
    while (true)
    {
        printf("\t\t\t*****************************************************\n");
        printf("\t\t\t*---------------------------------------------------*\n");
        printf("\t\t\t*                   停车场收费管理系统              *\n");
        printf("\t\t\t*****************************************************\n");
        printf("\t\t\t********************系统功能菜单*********************\n");
        printf("\t\t\t----------------------     --------------------------\n");
        printf("\t\t\t*****************************************************\n");
        printf("\t\t\t**    1、录入汽车信息   *     2、查看汽车信息      **\n");
        printf("\t\t\t*****************************************************\n");
        printf("\t\t\t**    3、收费信息查看   *     4、查询车库车辆      **\n");
        printf("\t\t\t*****************************************************\n");
        printf("\t\t\t----------------------     --------------------------\n");
        int input;
        cin >> input;
        system("cls");
        switch (input)
        {
        case 1:
        {
            entering();
            system("cls");
            break;
        };
        case 2:
        {
            Find();
            system("cls");
            break;
        };
        case 3:
        {
            Erase();
            system("cls");
            break;
        };
        case 4:
        {
            statistics();
            system("cls");
            break;
        };
        }
    }
}
cpp 复制代码
//main.cpp
#include"SearchBinaryTree.h"
#include"Parking_Fee.h"

    int main()
    {
        system("color F4");
        ParFee par;
        par.menu();
        return 0;
    }
相关推荐
时光の尘11 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
我们的五年16 分钟前
【Linux课程学习】:进程描述---PCB(Process Control Block)
linux·运维·c++
-一杯为品-21 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
程序猿阿伟32 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
Lenyiin1 小时前
02.06、回文链表
数据结构·leetcode·链表
爪哇学长1 小时前
双指针算法详解:原理、应用场景及代码示例
java·数据结构·算法
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan1 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
烦躁的大鼻嘎2 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝2 小时前
C/C++内存管理
java·c语言·c++