【html5源码怎么用】【flvparser源码】【zf源码】dequeue源码

2024-11-18 23:01:35 来源:ms 源码管理 分类:探索

1.求用vbnet 实现先进先出即队列得源代码
2.LinkedBlockingQueue
3.python有多少个模块(python常用的模块有哪些?)
4.JDK源码分析-Queue, Deque
5.如何在Android上实现FrameBuffer和Overlay的blend
6.C语言停车场管理系统

dequeue源码

求用vbnet 实现先进先出即队列得源代码

       VB.Net中的队列类在System.Collections.Generic命名空间中,名字叫Queue,是一个泛型类。

       实例化该类:

       Dim myQueue As Queue<Int>

       myQueue = new Queue<Int>();

       然后可以通过Queue中的Enqueue和Dequeue函数进行入队出队操作:

       With myQueue

        .Enqueue(1)

        .Enqueue(2)

        .Enqueue(3)

        .Enqueue(4)

        .Enqueue(5)

       End With

       For i = 0 To 5 Step 1

        Console.WriteLine(myQueue.Dequeue())

       Next i

       显示结果:

       1

       2

       3

       4

       5

LinkedBlockingQueue

        LinkedBlockingDeque在结构上有别于之前讲解过的阻塞队列,它不是Queue而是Deque,中文翻译成双端队列,双端队列指可以从任意一端入队或者出队元素的队列,实现了在队列头和队列尾的高效插入和移除

        LinkedBlockingDeque是链表实现的线程安全的无界的同时支持FIFO、LIFO的双端阻塞队列,可以回顾下之前的LinkedBlockingQueue阻塞队列特点,本质上是类似的,但是又有些不同:

        Queue和Deque的关系有点类似于单链表和双向链表,LinkedBlockingQueue和LinkedBlockingDeque的内部结点实现就是单链表和双向链表的区别,具体可参考源码。

        在第二点中可能有些人有些疑问,两个互斥锁和一个互斥锁的区别在哪里?我们可以考虑以下场景:

        A线程先进行入队操作,B线程随后进行出队操作,如果是LinkedBlockingQueue,A线程入队过程还未结束(已获得锁还未释放),B线程出队操作不会被阻塞等待(锁不同),如果是LinkedBlockingDeque则B线程会被阻塞等待(同一把锁)A线程完成操作才继续执行

        LinkedBlockingQueue一般的操作是获取一把锁就可以,但有些操作例如remove操作,则需要同时获取两把锁,之前的LinkedBlockingQueue讲解曾经说明过

        LinkedBlockingQueue 由于是单链表结构,只能一端操作,读只能在头,写只能在尾,因此两把锁效率更高。LinkedBlockingDeque 由于是双链表结构,两端头尾都能读写,因此只能用一把锁保证原子性。 当然效率也就更低

        ArrayBlockingQueue

        LinkedBlockingQueue

        问题,为什么ArrayBlockingQueue 不能用两把锁

        因为取出后,ArrayBlockingQueue 的元素需要向前移动。

        LinkedBlockingQueue内部由单链表实现,只能从head取元素,从tail添加元素。添加元素和获取元素都有独立的锁,也就是说LinkedBlockingQueue是读写分离的,读写操作可以并行执行。LinkedBlockingQueue采用可重入锁(ReentrantLock)来保证在并发情况下的线程安全。

        LinkedBlockingQueue一共有三个构造器,分别是无参构造器、可以指定容量的构造器、可以穿入一个容器的构造器。如果在创建实例的时候调用的是无参构造器,LinkedBlockingQueue的默认容量是Integer.MAX_VALUE,这样做很可能会导致队列还没有满,但是内存却已经满了的情况(内存溢出)。

        size()方法会遍历整个队列,时间复杂度为O(n),所以最好选用isEmtpy

        1.判断元素是否为null,为null抛出异常

        2.加锁(可中断锁)

        3.判断队列长度是否到达容量,如果到达一直等待

        4.如果没有队满,enqueue()在队尾加入元素

        5.队列长度加1,此时如果队列还没有满,调用signal唤醒其他堵塞队列

        1.加锁(依旧是ReentrantLock),注意这里的锁和写入是不同的两把锁

        2.判断队列是否为空,如果为空就一直等待

        3.通过dequeue方法取得数据

        3.取走元素后队列是否为空,如果不为空唤醒其他等待中的队列

        原理:在队尾插入一个元素, 如果队列没满,立即返回true; 如果队列满了,立即返回false。

        原理:如果没有元素,直接返回null;如果有元素,出队

        1、具体入队与出队的原理图:

        图中每一个节点前半部分表示封装的数据x,后边的表示指向的下一个引用。

        1.1、初始化

        初始化之后,初始化一个数据为null,且head和last节点都是这个节点。

        1.2、入队两个元素过后

        1.3、出队一个元素后

        表面上看,只是将头节点的next指针指向了要删除的x1.next,事实上这样我觉的就完全可以,但是jdk实际上是将原来的head节点删除了,而上边看到的这个head节点,正是刚刚出队的x1节点,只是其值被置空了。

        2、三种入队对比:

        3、三种出队对比:

python有多少个模块(python常用的模块有哪些?)

       今天给各位分享python有多少个模块的知识,其中也会对python常用的模块有哪些?进行解释,如果能碰巧解决你现在面临的html5源码怎么用问题,别忘了关注本站,现在开始吧!

本文目录一览:1、Python开发中常用的模块有哪些2、python目前三方提供的可用编程模块函数库组件规模有多大3、python中都有哪些模块呢4、Python中的模块5、Python模块的flvparser源码几种类型简介Python开发中常用的模块有哪些

       一、导入模块

       importmodule

       frommodule.xximportxx

       frommodule.xximportxxasrename

       frommodule.xximport

*

       二、开源模块

       yum、pip、apt-get

       源码编译安装:Pythonsetup.pybuildPythonsetupinstall

       三、常用模块

       os模块#用作系统级别的工作

       sys模块#提供解释器相关操作

       hashlib模块#用于加密相关的操作

       json和pickle模块#用于序列化数据

       subprocess模块

       shuit模块#文件的复制移动

       logging模块#格式化记录日志

       random模块用于取随机数

       timedatetime模块时间模块

       re模块正则匹配

       python目前三方提供的可用编程模块函数库组件规模有多大

       C++,Java和Python是竞争性编程的三种最常见的语言。在本文中,我们将从竞争性编程和面试准备的角度重点介绍最重要的Python模块。

       list:动态大小的数组,允许在不关心数组大小的情况下进行插入和删除。它还具有普通数组的优点,例如随机访问和缓存友好性。list也可以用作队列和堆栈。zf源码

       deque:Dequeue支持在O(1)时间内在两端进行插入和删除。由于它是使用数组实现的,因此它也允许随机访问。我们可以使用dequeue来实现队列和堆栈。关于Deque的示例问题是,访问所有的汽油泵和所有大小为k的子阵列的最大值。

       请注意,Python中没有用于队列(Queue)和堆栈(Stack)的模块。我们可以使用列表(list)或双端队列(deque)来实现这些。首选双端队列(deque)实现,尤其是对于队列,因为在列表前面进行插入/删除很慢。

       在我们希望具有FIFO项目顺序的源码之前情况下,队列(Queue)很有用。问题示例包括:用给定的数字生成数字,流中的第一个非重复字符,树及其变体的级序遍历,图的BFS及其变体。

       set和dict:它们都实现了哈希。当我们有键的集合时,我们使用set。当我们有键值对时,我们使用字典(dictionary)。当我们希望快速搜索、插入和删除时非常有用(这三个操作都是O(1))。这是garray源码业界使用最多的数据结构之一,也是学术界最低估的数据结构之一。常见的问题有:离散元素的计数、数组项的频率、零和子阵、两个未排序数组的并集、交集等。

       heapq:默认情况下实现MinHeap。我们也可以创建最小堆。只要我们希望有效地找到最小或最大元素,就使用它。它用于实现流行的算法,例如Prim算法,Dijkstra最短路径,霍夫曼编码,K个最大元素,购买和合并K个排序数组的最大玩具,流的中位数。

       sorted:对列表等序列进行排序。基于排序的示例问题包括:合并重叠间隔,所需的最小平台。第K个最小元素,求给定和的三元组。

       bisect:用于二进制搜索。基于二进制搜索的示例问题有:查找第一次出现的索引、计数出现次数、峰值元素、两个排序数组的中值。

       注意:与C++STL和Java集合(Collections)不同。Python标准库包含自平衡BST的实现。在Python中,我们可以使用bisect模块来保留一组排序后的数据。我们还可以使用PyPi模块,例如rbtree(红黑树的实现)和pyavl(AVL树的实现)。

python中都有哪些模块呢

       os模块

       os.getcwd()#获取当前工作目录,即当前python脚本工作的目录路径

       os.chdir("dirname")#改变当前脚本工作目录;相当于shell下cd

       os.curdir#返回当前目录:('.')

       os.pardir#获取当前目录的父目录字符串名:('..')

       os.makedirs('dirname1/dirname2')#可生成多层递归目录

       os.removedirs('dirname1')#若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推

       os.mkdir('dirname')#生成单级目录;相当于shell中mkdirdirname

       os.rmdir('dirname')##删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdirdirname

       os.listdir('dirname')#列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

       os.remove()#删除一个文件

       os.rename("oldname","newname")#重命名文件/目录

       os.stat('path/filename')#获取文件/目录信息

       os.sep#输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"

       os.linesep#输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"

       os.pathsep#输出用于分割文件路径的字符串win下为;,Linux下为:

       os.name#输出字符串指示当前使用平台。win-'nt';Linux-'posix'

       os.system("bashcommand")#运行shell命令,直接显示

       os.environ#获取系统环境变量

       os.path.abspath(path)#返回path规范化的绝对路径

       os.path.split(path)#将path分割成目录和文件名二元组返回

       os.path.dirname(path)#返回path的目录。其实就是os.path.split(path)的第一个元素

       os.path.basename(path)#

       返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素

       os.path.exists(path)#如果path存在,返回True;如果path不存在,返回False

       os.path.isabs(path)#如果path是绝对路径,返回True

       os.path.isfile(path)#如果path是一个存在的文件,返回True。否则返回False

       os.path.isdir(path)#如果path是一个存在的目录,则返回True。否则返回False

       os.path.join(path1[,path2[,...]])#将多个路径组合后返回,第一个绝对路径之前的参数将被忽略

       os.path.getatime(path)#返回path所指向的文件或者目录的最后访问时间

       os.path.getmtime(path)#返回path所指向的文件或者目录的最后修改时间

       os.path.getsize(path)#返回path的大小

       sys模块

       sys.argv#命令行参数List,第一个元素是程序本身路径

       sys.exit(n)#退出程序,正常退出时exit(0)

       sys.version#获取Python解释程序的版本信息

       sys.maxint#最大的Int值

       sys.path#返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值

       sys.platform#返回操作系统平台名称

       datetime模块

       datetime.today()返回一个表示当前本期日期时间的datetime对象

       datetime.now([tz])返回指定时区日期时间的datetime对象,如果不指定tz参数则结果同上

       datetime.utcnow()返回当前utc日期时间的datetime对象

       datetime.fromtimestamp(timestamp[,tz])根据指定的时间戳创建一个datetime对象

       datetime.utcfromtimestamp(timestamp)根据指定的时间戳创建一个datetime对象

       datetime.strptime(date_str,format)将时间字符串转换为datetime对象

Python中的模块

       importos

       print(os.name)?#操作系统名称?Windowsnt非Windowsposix

       print(os.sep)?#路径分隔符?Windows\?其他/

       importos

       #使用os.path方法获取文件的路径

       #.获取文件的绝对路径使用abspath方法

       print(os.path.abspath("_模块导入.py"))

       #?运行结果:D:\mypycharm\pythonProject\千峰培训\daymodule1\_模块导入.py

       #判断是否是文件False

       print(os.path.isdir(""))?

       #运行结果:False

       #.判断文件是否存在如果存在返回True否则返回False

       print(os.path.exists("mydir"))

       #True

       importos

       files="...test.py"

       print(files.rpartition(".")[-1])?

       print(os.path.splitext(files)[-1])

       #运行结果:

       #获取文件的后缀名?py

       #获取文件的后缀名.py

       importos

       print(os.getcwd())

       #运行结果:

       #D:\mypycharm\pythonProject\培训\daymodule1

       importos

       os.chdir("mydir")

       print(os.getcwd())

       #D:\mypycharm\pythonProject\培训\daymodule1\mydir

       importos

       os.rename(".py","../.py")

       importos

       #.删除文件

       os.remove("../.py")

       #.删除空文件夹

       os.rmdir("../mydir")

       os.removedirs("mydir")

       importos

       os.mkdir("mydir")

       importos

       #.列出指定目录里所有的子目录和文件

       print(os.listdir("D:\mypycharm\pythonProject"))

       #.默认当前目录里的子目录和文件

       print(os.listdir())

       #运行结果:

       #['.idea','千峰培训','学校实习']

       #['_module.py','_模块导入.py','_os.py','...tests.py','a_module1.py','a_module2.py','__pycache__']

       importos

       print(os.environ)

       print(os.environ["PATH"])

       importos

       importstring?#字符串模块

       importrandom

       files="test.jpg"

       #?.获取文件的后缀

       surffix=os.path.splitext(files)[-1]

       #print(surffix)?#.jpg

       #.生成所有大小写字母的列表

       res=list(string.ascii_letters)

       #print(string.ascii_letters)

       #运行结果;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ

       #?.将0-9添加到res中

       foriinrange(0,):

res.append(str(i))

       #.随机生成文件名:

       mystr="".join(random.sample(res,))?#?sample随机生成个字符

       #print(mystr)

       #bJpED6dj2Y

       #.将文件名和后缀拼接

       print(mystr+surffix)

       importsys

       print(sys.path)

       res=sys.stdin

       print(res)

       importmath

       #print(math.pi)?#3.

       print(math.factorial(5))?#

       #幂运算第一个参数是底数第二个参数是幂

       print(math.pow(2,3))?#8.0

       #向上取整和向下取整

       print(math.floor(.))?#

       print(math.ceil(.))?#

       #四舍五入

       print(round(.,1))?#.5

       #三角函数

       print(math.sin(math.pi/6))?#sin(pi/6)0.

       print(math.cos(math.pi/3))?#sin(pi/3)0.

       print(math.tan(math.pi/4))?#sin(pi/6)0.

       #开方

       a=9

       b=

       print(math.sqrt(a+b))?#5.0

       #以e为底的指数函数

       print(math.exp(a))

       #?.

       importrandom

       #.random()?随机生成[0,1)之间的数?前闭后开

       print(random.random())?#生成[0,1)之间的小数

       #.randint()生成范围内的随机整数全闭

       print(random.randint(,))?#生成[,]之间的整数

       #.randrange()生成范围内的随机整数前闭后开

       print(random.randrange(,))?#生成[,)之间的整数

       #.choice?参数是列表?随机从列表中取一个?取一次

       print(random.choice([1,2,3,4,5,6,,8,9]))

       #.sample的第一个参数必须是一个可迭代对象

       #?第二个参数代表着从可迭代对象从随机选取几个,选取的对象不能重复

       print("".join(random.sample(["a","b","c","d"],3)))

       importdatetimeasdt#引入datetime模块并将其命别名为dt

       importtime

       importcalendar?#引入日历模块

       #.datetime模块

       #.获取当前时间的具体信息

       print(dt.datetime.now())?

       #运行结果:

       #--::.

       #年?月日?时分秒?毫秒

       #.创建日期

       print(dt.date(,1,1))?

       #年月日?--

       #.创建时间

       print(dt.time(,,))

       #时分秒:?::

       #.timedelta()括号中的默认参数是天

       print(dt.datetime.now()+dt.timedelta(3))?#--::.

       print(dt.datetime.now()+dt.timedelta(hours=3))?#--::.

       print(dt.datetime.now()+dt.timedelta(minutes=))?#--::.

       #.time

       #.当前时间的时间戳

       #时间戳是指从—-:0:0到现在的秒数utc时间也叫格林尼治时间?

       print(time.time())

       #.按照指定格式输出时间

       #print(time.strftime("%Y-%m-%d%H:%M:%S"))?#--::

       #时间格式:

       #%Y?Yearwithcenturyasadecimalnumber.

       #%m?Monthasadecimalnumber[,].

       #%d?Dayofthemonthasadecimalnumber[,].

       #%H?Hour(-hourclock)asadecimalnumber[,].

       #%M?Minuteasadecimalnumber[,].

       #%S?Secondasadecimalnumber[,].

       #%z?TimezoneoffsetfromUTC.

       #%a?Locale'sabbreviatedweekdayname.

       #%A?Locale'sfullweekdayname.

       #%b?Locale'sabbreviatedmonthname.

       #%B?Locale'sfullmonthname.

       #%c?Locale'sappropriatedateandtimerepresentation.

       #%I?Hour(-hourclock)asadecimalnumber[,].

       #%p?Locale'sequivalentofeitherAMorPM.

       #.ctime和asctime时间格式?输出的时间格式一样,

       #print(time.asctime())?#TueDec::

       #print(time.ctime())?#TueDec::

       #.sleep()?时间休眠

       print("我负责浪")

       print(time.sleep(3))

       print("你负责漫")

       #.calender生成日历

       res=calendar.calendar()?#生成年的日历

       print(res)

       #.判断是否为闰年

       print(calendar.isleap())?#True

       #.从年到年有多少个闰年

       print(calendar.leapdays(,))?#8

Python模块的几种类型简介

       1、系统内置模块

       os模块:os模块包含普遍的操作系统功能

       sys模块:提供了一系列有关Python运行环境的变量和函数

       random模块:random模块用于生成随机数

       time模块:主要包含各种提供日期、时间功能的类和函数

       datetime模块:对time模块的一个高级封装

       shutil模块:是一种高层次的文件操作工具

       logging模块:将日志打印到了标准输出中

       re模块:可以直接调用来实现正则匹配

       pymysql模块:连接数据库,并实现简单的增删改查

       threading模块:提供了更强大的多线程管理方案

       queue模块:实现了多生产者,多消费者的队列

       json模块:用于字符串和数据类型间进行转换json

       2、开源(三方)模块

       Requests:最富盛名的e(SeqStack &parking , LQueue *&sidewalk); //有车到来时的操作

       void Car_leave(SeqStack &parking , LQueue *&sidewalk); //有车离开的操作

       void Display(SeqStack parking); //显示停车场内的所有信息 调试时用

       void InitStack(SeqStack &parking); //初始化栈

       void InitList(LQueue *&sidewalk); //初始化队列

       void In_LQueue(LQueue *&sidewalk , char *license_plate); //进队操作

       void Input_Check(char *license_plate); ////检验输入的车牌是否合法

       void StackPush(SeqStack &parking , char *license_plate , int stop_time);//进栈操作

       void main()

       {

        //定义变量

        SeqStack parking;

        LQueue *sidewalk = NULL;

        char *choice = new char;

        int flag = 1; //定义一个变量 判断是否退出

        //初始化一个为空的停车场

        InitStack(parking);

        //初始化一个为空的便道

        InitList(sidewalk);

        //运行界面及功能选择

        while(flag)

        {

        cout<<"\n\t 停车场模拟管理系统 \n\n";

        cout<<"\t|--------------------------------------------------|\n\n";

        cout<<"\t|本程序为停车场的模拟管理系统,有车到来时请按C键。|\n\n";

        cout<<"\t|然后根据屏幕提示进行相关操作,有车要走时请按l键。|\n\n";

        cout<<"\t|然后根据屏幕提示进行相关操作,查看停车场请按D键。|\n\n";

        cout<<"\t|然后根据屏幕提示进行相关操作,要退出系统请按Q键。|\n\n";

        cout<<"\t|--------------------------------------------------|\n\n";

        cout<<"请选择操作:";

        gets(choice);

        if(1 != strlen(choice))

        {

        cout<<"请正确输入选项!";

        continue;

        }

        else

        {

        switch(*choice)

        {

        case 'c':

        case 'C':

        {

        Car_come(parking,sidewalk);break;

        }

        case 'l':

        case 'L':

        {

        Car_leave(parking,sidewalk);break;

        }

        case 'q':

        case 'Q':

        {

        flag=0;break;

        }

        case 'd':

        case 'D':

        {

        Display(parking);break;

        }

        default:

        cout<<"选择不正确!请重新选择!\n";

        }

        }

        }

       }

       //有车到来时的操作

       void Car_come(SeqStack &parking , LQueue *&sidewalk)

       {

        //定义变量

        char license_plate[MAX_PLATE];

        cout<<"请输入车辆的车牌号码:";

        Input_Check(license_plate);

        //判断停车场是否已满,满则进入便道,不满进入停车场

        if(StackFull(parking))

        {

        In_LQueue(sidewalk , license_plate); //进入便道

        cout<<"停车场已满请在便道等候,您的位置为"<<QueueLength(sidewalk)

        <<endl;

        }

        else

        {

        StackPush(parking , license_plate , GetTickCount()); //进入停车场

        cout<<"请进入停车场中的"<<parking.top+1<<"号停车位\n";

        }

       // Display(parking);

       }

       //有车离开时的操作

       void Car_leave(SeqStack &parking , LQueue *&sidewalk)

       {

        //定义变量

        SeqStack tmpparking; //定义临时停车场

        char leave_license_plate[MAX_PLATE]; //要离开的车牌号

        char license_plate[MAX_PLATE]; //存放从停车场中读出来的车牌信息

        int time;

        InitStack(tmpparking); //初始化临时停车场

        //判断停车场中是否有车

        if(StackEmpty(parking))

        {

        cout<<"当前停车场中没有车\n";

        return; //退出子函数

        }

        cout<<"请输入要离开的车牌照:";

        Input_Check(leave_license_plate);

        cout<<"当前停车场中有"<<parking.top+1<<"辆车\n";

        if(LeaveCheck(parking , leave_license_plate)) //判断车是否在停车场中

        {

        //车在停车场中

        cout<<"您的车在"<<LeaveCheck(parking , leave_license_plate)<<"号车位上\n";

        while(StackTop(parking , license_plate , time)

        && (strcmp(parking.STOP[parking.top].license_plate , leave_license_plate) != 0))

        {

        strcpy(parking.STOP[parking.top].license_plate , license_plate);

        cout<<"牌照为"<<license_plate<<"的车暂时退出停车场"<<parking.top+1<<"号位\n";

        StackPush(tmpparking , license_plate , time); //停车场中的车暂时退出 进入临时停车场

        StackPop(parking); //出栈

        }

        cout<<"牌照为"<<license_plate<<"的车离开停车场"<<parking.top+1<<"号位\n";

        cout<<"您在停车场中停了"<<(GetTickCount()-time)/TIME_MS_TO_CONUT<<TIME_COUNT<<endl; //输出所停时间信息

        cout<<"应缴费用为"<<(GetTickCount()-time)/TIME_MS_TO_CONUT*UNIT_PRICE<<"元\n";; //输出费用信息

        StackPop(parking); //出栈

        //将临时停车场中的车停回停车场

        while(StackEmpty(tmpparking) != 1)

        {

        StackTop(tmpparking , license_plate , time);

        StackPush(parking , license_plate , time);

        cout<<"牌照为"<<license_plate<<"的车进入停车场"<<parking.top+1<<"号位\n";

        license_plate[0] = '\0';

        StackPop(tmpparking);

        }

        if(parking.top+1 == MAX_STOP-1) //判断车离开前停车场是否停满

        if(QueueLength(sidewalk)) //如果停满则判断便道上是否有车

        {

        //便道中有车 则从便道中停入停车场

        Out_LQueue(sidewalk , license_plate); //出队

        StackPush(parking , license_plate , GetTickCount()); //入栈

        cout<<"在便道中牌照为"<<license_plate<<"的车进入停车场"<<parking.top+1<<"号位\n";

        }

        }

        else

        //车不在停车场中

        cout<<"您的车不在停车场中!\n";

       }

       //初始化顺序栈

       void InitStack(SeqStack &parking)

       {

        parking.top = -1;

       }

       //判栈空

       int StackEmpty(SeqStack parking)

       {

        if(parking.top == -1)

        return 1;

        else

        return 0;

       }

       //判栈满

       int StackFull(SeqStack parking)

       {

        if(parking.top == MAX_STOP-1)

        return 1;

        else

        return 0;

       }

       //入栈

       void StackPush(SeqStack &parking , char *license_plate , int stop_time)

       {

        parking.top++;

        strcpy(parking.STOP[parking.top].license_plate , license_plate);

        parking.STOP[parking.top].state = 'p';

        parking.STOP[parking.top].time = stop_time;

       }

       //出栈 返回栈顶指针

       int StackPop(SeqStack &parking)

       {

        if(StackEmpty(parking))

        return 0;

        else

        return parking.top--;

       }

       //取栈顶元素

       int StackTop(SeqStack parking , char *license_plate , int &time)

       {

        if(StackEmpty(parking))

        return 0;

        else

        {

        strcpy(license_plate , parking.STOP[parking.top].license_plate);

        time = parking.STOP[parking.top].time;

        return 1;

        }

       }

       //显示所有

       void Display(SeqStack parking)

       {

        if(parking.top == -1)

        printf("停车场为空\n");

        else

        {

        while(parking.top != -1)

        {

        cout<<"车牌号为:"<<parking.STOP[parking.top].license_plate;

        cout<<",停在"<<parking.top + 1 <<"号车位上";

        cout<<",已停"<<(GetTickCount()-parking.STOP[parking.top].time)/TIME_MS_TO_CONUT<<TIME_COUNT<<endl;

        parking.top--;

        }

        }

       }

       //初始化队列

       void InitList(LQueue *&sidewalk)

       {

        sidewalk = (LQueue *)malloc(sizeof(LQueue));

        sidewalk->front=sidewalk->rear = NULL;

       }

       //入队

       void In_LQueue(LQueue *&sidewalk,char *license_plate)

       {

        QNode *car_on_sidewalk;

        car_on_sidewalk = (QNode *)malloc(sizeof(QNode)); //为新节点开辟新空间

        strcpy(car_on_sidewalk->WAIT.license_plate , license_plate); //将数据写入节点

        car_on_sidewalk->WAIT.state = 's'; //写入停车信息

        car_on_sidewalk->WAIT.time = GetTickCount(); //写入停车时间

        car_on_sidewalk->next = NULL;

        if(Empty_LQueue(sidewalk)) //队空则创建第一个节点

        sidewalk->front = sidewalk->rear = car_on_sidewalk;

        else

        {

        //队非空插入队尾

        sidewalk->rear->next = car_on_sidewalk;

        sidewalk->rear = car_on_sidewalk;

        }

       }

       //判队空

       int Empty_LQueue(LQueue *q)

       {

        if(q->front == NULL)

        return 1;

        else

        return 0;

       }

       //判队长度 返回队长

       int QueueLength(LQueue *q)

       {

        QNode *p=q->front;

        int i=0;

        while(p != NULL)

        {

        i++;

        p=p->next;

        }

        return i;

       }

       //出队 成功返回1 队空返回0

       int Out_LQueue(LQueue *&sidewalk,char *license_plate)

       {

        QNode *car_on_sidewalk;

        if(Empty_LQueue(sidewalk)) //如果队空返回0

        return 0;

        car_on_sidewalk = sidewalk->front;

        strcpy(license_plate , car_on_sidewalk->WAIT.license_plate);//取出队头元素

        if(sidewalk->front == sidewalk->rear) //队中只有一个元素

        sidewalk->front = sidewalk->rear=NULL; //删除元素

        else

        sidewalk->front = sidewalk->front->next; //队头指针后移

        free(car_on_sidewalk); //释放指针

        return 1;

       }

       //检查离开的车是否在停车场中 返回车在停车场中位置 不在则返回0

       int LeaveCheck(SeqStack parking,char *license_plate)

       {

        int flag = parking.top+1; //定义变量记录当前车在停车场中位置

        if(StackEmpty(parking))

        return 0;

        else

        {

        //查找离开车所在位置

        while(parking.top != -1 && strcmp(parking.STOP[parking.top].license_plate , license_plate) != 0)

        {

        flag--;

        parking.top--;

        }

        return flag;

        }

       }

       //检验输入的车牌是否合法

       void Input_Check(char *license_plate)

       {

        int flag = 1;

        int i;

        string tmpstr;

        while(flag)

        {

        cin>>tmpstr;

        getchar();

        if(tmpstr.length()<MAX_PLATE)

        {

        for(i=0;i<;i++)

        license_plate[i] = tmpstr.c_str()[i];

        flag = 0;

        }

        else

        cout<<"输入有误,请重新输入:";

        }

       }

       ä»¥å‰çš„课设 你看看吧 纯手工的~~

本文地址:http://8o.net.cn/html/14c163998346.html 欢迎转发