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

系统效果:
录入汽车信息

查看汽车信息

收费信息查看

查询车库车辆

代码展示:

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;
    }
相关推荐
DARLING Zero two♡19 分钟前
关于我、重生到500年前凭借C语言改变世界科技vlog.16——万字详解指针概念及技巧
c语言·开发语言·科技
7年老菜鸡20 分钟前
策略模式(C++)三分钟读懂
c++·qt·策略模式
Ni-Guvara28 分钟前
函数对象笔记
c++·算法
似霰33 分钟前
安卓智能指针sp、wp、RefBase浅析
android·c++·binder
芊寻(嵌入式)43 分钟前
C转C++学习笔记--基础知识摘录总结
开发语言·c++·笔记·学习
獨枭1 小时前
C++ 项目中使用 .dll 和 .def 文件的操作指南
c++
霁月风1 小时前
设计模式——观察者模式
c++·观察者模式·设计模式
橘色的喵1 小时前
C++编程:避免因编译优化引发的多线程死锁问题
c++·多线程·memory·死锁·内存屏障·内存栅栏·memory barrier
泉崎1 小时前
11.7比赛总结
数据结构·算法
你好helloworld1 小时前
滑动窗口最大值
数据结构·算法·leetcode