C/C++利用栈和队列实现停车场管理系统

目录
  • 纯c语言版
    • 包含的功能
    • 运行效果
    • 源码
  • c++版
    • 包含的功能
    • 运行效果
    • 源码

纯c语言版

包含的功能

1、停车功能

如果停车场满,能够暂时存放到便道内

2、开走车功能

将指定车开走后打印收据,便道内的车自动停到停车场

3、退出程序功能

运行效果

停车功能测试:

离开停车场并打印收据测试:

源码

#define _CRT_SECURE_NO_WARNINGS//visual stduio添加对scanf的信任
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#include<math.h>
#define size 1 //停车场位置数
//模拟停车场的堆栈的性质;
typedef struct zanlind {
    int number; //汽车车号
    float ar_time; //汽车到达时间
}zanInode;//车结点
typedef struct {
    zanInode* base; //停车场的堆栈底
    zanInode* top; //停车场的堆栈顶
    int stacksize_curren;//堆栈长度
}stackhead;
//堆栈的基本操作;
void initstack(stackhead& L) //构造一个空栈L
{
    L.base = (zanInode*)malloc(size * sizeof(zanlind));//给栈L分配空间
    if (!L.base) exit(0);  //存储分配失败
    L.top = L.base;//初始化栈顶和栈底指针相同
    L.stacksize_curren = 0;//初始化栈长度为0
}
void push(stackhead& L, zanInode e) //插入元素e为新的栈顶元素
{
    *L.top++ = e;//先让L栈的栈顶指向e,然后栈顶指针+1
    L.stacksize_curren++;//由于上面的e进入了栈内,所以栈长度加一
}
void pop(stackhead& L, zanInode& e) //若栈不为空,删除L的栈顶元素,用e返回其值
{
    if (L.base==L.top)//栈长度为0时,停车场为空
    {
        printf("停车场为空!!");
        return;
    }
    e = *--L.top;//如果栈顶和栈底不等,那么e为当前top指针减一后的指向,这是因为栈顶指针始终指向栈顶元素的上面。
    L.stacksize_curren--;//随着top指针减一,栈长度减一。注意返回e是通过引用完成的,就是 &e,e的变化会导致实参的变化
}
//模拟便道的队列的性质;
typedef struct duilie {//队列就是便道(候车区)
    int number; //汽车车号
    float ar_time; //汽车到达时间
    struct duilie* next;//链式的队列结点,通过next指针访问相邻的队列结点
}*queueptr;//指向队列结点自身的指针
typedef struct {
    queueptr front; //便道的队列的对头
    queueptr rear; //便道的队列的队尾
    int length;//队列长度
}linkqueue;
//队列的基本操作;
void initqueue(linkqueue& q) //构造一个空队列q,也是初始化
{
    q.front = q.rear = (queueptr)malloc(sizeof(duilie));//给队列q动态分配空间
    if (!q.front || !q.rear)
        exit(0);          //如果队首指针和队尾指针为NULL,则存储分配失败
    q.front->next = NULL;//队首指针的下一个队列结点置为NULL,队列结点进队列只能从队尾进
    q.length = 0;//初始化队列长度为零
}

void enqueue(linkqueue& q, int number, int ar_time)  //进队列,把车结点插入队列尾(属性为number,ar_time)
{
    queueptr p;//创建队列指针p
    p = (queueptr)malloc(sizeof(duilie));//为p分配空间
    if (!p) exit(0);                     //为空则存储分配失败
    p->number = number;//让队列结点的车牌号等于插入进来的车牌号
    p->ar_time = ar_time;//同上,给时间赋值
    p->next = NULL;//保证只能从队尾进队列
    q.rear->next = p;//将p结点插入到队尾
    q.rear = p;//此时队尾指针rear指向插入进来的p结点,方便下一次从队尾插入车结点信息
    q.length++;//插入后队列长度加一
}
void popqueue(linkqueue& q, queueptr& w)      //删除q的队头元素 w(属性为number,ar_time)
{
    queueptr p;//创建中间队列指针p
    if (q.length==0)//队首队尾指针相同则候车区无车
    {
        printf("停车场通道为空");
        return;
    }
    p = q.front->next;//p指针指向队列q中的队首位置
    w = p;//将队首元素赋值给w,即w代表删除的队首元素
    q.front->next = p->next;//删除队首元素
    q.length--;//删除后队列长度减一
}

float shijiancha(float x, float y) //求时间差的子程序,x是进入时间,y是离开时间
{
    if (x > y) {
        printf("非法时间数据");
        return -1;
    }
    int shix, shiy, fenx, feny;
    float shijiancha;//返回值,待赋值
    shix = x;//shix为进入时间的整数部分
    shiy = y;//shiy为离开时间的整数部分
    fenx = (int)((x - shix) * 100);//fenx为进入时间的小数部分的100倍
    feny = (int)((y - shiy) * 100);//feny为离开时间的小数部分的100倍
    if (fenx > feny)
    {//如果fenx>feny,时间差就等于离开的整数减去进入的整数-1再加上60+feny-fenx,实际上feny-fenx是负数
        shijiancha = (shiy - shix - 1) + (float)(feny + 60 - fenx) / 100;
    }
    else//这个就是正常的了,整数部分减加上小数部分减即可
        shijiancha = (shiy - shix) + (float)(feny - fenx) / 100;
    return shijiancha;//返回值为时间差
}

void jinru(stackhead& st, linkqueue& q)        //对进入停车场的汽车的处理;
{
    int number;//待使用的车牌号
    float time_a;//待使用的时间
    printf("请输入车牌号:");
    scanf("%d", &number);//
    printf("请输入您进车场的时间(比如说:8点半则输入8.30):"); scanf("%f", &time_a);
    if (st.stacksize_curren < 2)//停车场可以停2辆车,大于两辆车执行else的语句
    {
        zanInode e;//创建车结点
        e.number = number;//给车牌号赋值
        e.ar_time = time_a;//给车时间赋值
        push(st, e);//将赋值好的车结点入栈
        printf("请把你的车停在%d号车道\n\n", st.stacksize_curren);//提示车停在了哪个车道
    }
    else//如果执行这段代码,说明停车场以及停满2辆车
    {
        enqueue(q, number, time_a);//将车停入候车区,也就是便道
        printf("停车场已满,请把你的车停在便道的第%d个位置上\n", q.length);
    }
}

void likai(stackhead &st, stackhead &sl, linkqueue &q)       //对离开的汽车的处理;
{                                     //st 堆栈为停车场,sl 堆栈为倒车场
    int number, flag = 1;                    //q 为便道队列
    float sh, time_d, arrivaltime, money1;
    printf("请输入您的车牌号:"); scanf("%d", &number);
    printf("请输入您出车场的时间(比如说:8点半则输入8.30):");  scanf("%f", &time_d);
    zanInode e, q_to_s;//e为要查找的车结点,q_to_s为后面将从便道进入停车场的车结点
    queueptr w;//队列指针,待使用
    while (flag)  //此时flag=1,死循环
    {
        pop(st, e);//取出栈顶结点
        push(sl, e);//将取出的栈顶结点放入倒车场
        if (e.number == number)//如果车牌号对应
        {
            flag = 0;//flag变为0,死循环结束
            arrivaltime = e.ar_time;//将该结点的进入时间赋值给arrivaltime
            sh = shijiancha(arrivaltime, time_d);//带入计算时间差的函数并将时间差赋值给sh
            money1 = (int)sh * 2 + (sh - (int)sh) * 100 / 30;//收费依据
        }
    }
    pop(sl, e);                    //把倒车场的第一辆车(要离开的)去掉;
    while (sl.stacksize_curren)   //把倒车场的车倒回停车场
    {
        pop(sl, e); //取出栈顶结点
        push(st, e);//将取出的栈顶结点放入倒车场
    }
    if (st.stacksize_curren < 2 && q.length != 0)   //停车场有空位,便道上的车开进入停车场
    {
        popqueue(q, w);//取出便道的第一个车并把其信息赋值给w指针
        q_to_s.ar_time = w->ar_time;//将该车信息赋值给q_to_s结点
        q_to_s.number = w->number;
        push(st, q_to_s);//入栈,即停车
        printf("车牌为%d 的车已从通道进入停车场, 所在的停车位为 %d:\n", q_to_s.number, st.stacksize_curren);
    }
    printf("\n 收据");
    printf("车牌号:%d\n", number);
    printf("++++++++++++++++++++++++++++++\n");
    printf("     进车场时间:%4.2f\n", arrivaltime);
    printf("     出车场时间:%4.2f\n", time_d);
    printf("     停留时间:%4.2f\n", sh);
    printf("     应付(元) %4.2f\n", money1);
    printf("++++++++++++++++++++++++++++++\n\n");
}

int main()
{
    int m = 100;
    int choose;                 //进入或离开的标识;
    stackhead sting, slinshi;  //停车场和临时倒车场堆栈的定义;
    linkqueue line;          //队列的定义;
    initstack(sting);        //构造停车场堆栈sting
    initstack(slinshi);      //构造倒车场堆栈slinshi
    initqueue(line);         //构造便道队列line
    printf("\n      ******************停车场管理程序***************        ");
    printf("\n*===========================================================*");
    printf("\n*温馨提示:请车主在24:00之前来取车,给您带来的不便,敬请原谅!*");
    printf("\n* 1 *** 汽车进车场    2 *** 汽车出车场     3 *** 退出程序   *");
    printf("\n*===========================================================*\n");
    while (m)//m为100,可以重复操作100次
    {
        printf("          请输入您需要的服务的代号(1、2、3),谢谢!\n");
        scanf("%d", &choose);//待选择的操作
        switch (choose)
        {
        case 1: jinru(sting, line); break;            //汽车进车场
        case 2: likai(sting, slinshi, line); break;    //汽车出车场
        case 3: exit(0);//退出
        }
        --m;//m递减
    }
}

c++版

包含的功能

1、停车功能

如果停车场满,能够暂时存放到便道内

2、开走车功能

将指定车开走后自动计费,便道内的车自动停到停车场

3、查看停车场停车情况功能

可以查看停车场有无空位和停车信息。

4、退出程序功能

运行效果

停车功能测试:

离开停车场并自动计费测试:

查看停车场状况功能测试:

源码

#define _CRT_SECURE_NO_WARNINGS//visual stduio添加对scanf的信任
#include <stdio.h>
#include <stdlib.h>
#include <iostream>//C++IO流头文件
using namespace std;//C++命名空间,配合IO流头文件可使用cin>>输入,cout<<输出
#define MaxSize 5  //停车场最大停车位
#define fee 2 //一小时的费用
#define L    10000//宏定义
typedef int ElemType;//将整型int名字变为ElemType,下面再使用ElemType就是整型的意思
ElemType tmpnum = 0;//车牌号
ElemType tmptime = 0;//进入时间
typedef struct {
    ElemType car_num[MaxSize];//车牌号数组
    ElemType car_time[MaxSize];//进入时间数组
    int top;//数组下标
}STACK;//栈,存放所有的车牌号和进入时间数组
typedef struct qnode {//队列结点
    ElemType car_num;//包含车牌号
    ElemType car_time;//和进入时间
    struct qnode* next;//指向自身的指针,用来当问相邻队列结点
}QTYPT;//将qnode重命名为QTYPT
typedef struct qptr {//队列
    QTYPT* front;//队首指针
    QTYPT* rear;//队尾指针
}SQUEUE;//将qptr重命名为SQUEUE
void InitStack(STACK* S) {//初始化栈S
    S->top = -1;//数组下标初始化为-1
}

int Full(STACK* S) {//栈满的情况
    if (S->top == MaxSize - 1) {
        printf("\n Stack is full! Push");//提示栈满
        return 0;
    }
    return 1;
}
//入栈函数Push
int Push(STACK* S, ElemType num, ElemType time) {
    if (S->top == MaxSize - 1) {
        printf("\n Stack is full! Push");//栈满提示,并退出
        return 0;
    }
    S->top++;                      //栈不满时数组下标加一,此时为0
    S->car_num[S->top] = num;      //栈车牌号数组的car_num[top]赋值为num
    S->car_time[S->top] = time;    //同车牌号,这次是进入时间的赋值
    return 1;                      //赋值成功则返回1
}

int Empty(STACK* S) {//栈空的情况
    return (S->top == -1 ? 1 : 0);//栈空返回1
}
//出栈函数Pop
int Pop(STACK* S, ElemType* num, ElemType* time) {
    if (Empty(S)) {//栈空无法出栈
        puts("Stack is free Pop");
        return 0;
    }//栈不空时
    *num = S->car_num[S->top]; //将栈顶的车牌号赋值给*num
    *time = S->car_time[S->top];//赋值时间给*time
    S->top--;//出栈后数组下标减一
    return 1;
}
//初始化队列
void InitQueue(SQUEUE* LQ) {
    QTYPT* p = NULL;//创建队列结点指针
    p = (QTYPT*)malloc(sizeof(QTYPT));//为p职责和你分配空间
    p->next = NULL;//使p指针的next为空,相当于头结点
    LQ->front = LQ->rear = p;//初始化队首和队尾指针指向头结点p,
}
//将队列结点入队
int EnQueue(SQUEUE* LQ, ElemType num, ElemType time) {
    QTYPT* s;//创建s指针
    s = (QTYPT*)malloc(sizeof(QTYPT));//分配空间
    s->car_num = num;//将车牌号赋值给p指向的车牌号
    s->car_time = time;//赋值时间
    s->next = LQ->rear->next;//将s结点插入到队尾的下一个位置
    LQ->rear->next = s;//队尾指针的下一个位置指向s
    LQ->rear = s;//队尾指针指向新插入的结点,这样时头插法,符合队列后进后出的特点
    return 1;
}
//计算队列有多少结点
int CountQueue(SQUEUE* LQ) {
    int i = 1;
    QTYPT* mfront = NULL;//创建该队列的新队首指针
    QTYPT* mrear = NULL;//创建新队尾指针
    mfront = LQ->front;//将队首指针赋值给新队首指针,记录作用
    mrear = LQ->rear;//同上
    while (!(LQ->front == LQ->rear)) {//当队首不等于队尾指针时,i++,统计的结点个数增加
        i++;
        LQ->front = LQ->front->next;//队首指向队首的下一个位置
    }
    LQ->front = mfront;//统计完成后将队首指针指向原来的地址
    return i;//i为结点个数
}

int Empty_Q(SQUEUE* LQ) {//队列为空
    return (LQ->front == LQ->rear ? 1 : 0);
}

int OutQueue(SQUEUE* LQ, ElemType* num, ElemType* time) {//取队首
    QTYPT* p;//创建对列结点指针
    if (Empty_Q(LQ)) {//队列空不能取队首
        puts("Quenue is free OutQuenue");
        return 0;
    }
    p = LQ->front->next;//p指向队首结点
    *num = p->car_num;//将队首结点信息赋值
    *time = p->car_time;
    LQ->front->next = p->next;//删除队首结点
    if (LQ->front->next == NULL)//如果队首结点不存在
        LQ->rear = LQ->front;//队首队尾指针相同,队空
    free(p);//释放p结点
    return 1;
}
//检查有无重复车牌号
int chackinput(STACK* S, int pnum) {
    int i = 0;
    int num;
    num = pnum;//将车牌号赋值
    i = S->top;//i为栈顶位置的数组下标
    for (; !(i == -1); i--)//从高到底遍历car_num数组,找到车牌号返回1,否则返回0
        if (S->car_num[i] == num)
            return 1;
    return 0;
}
//检查时间输入是否合理
int chacktime(STACK* S, int ptime) {
    return S->car_time[S->top] <= ptime ? 1 : 0;//只有离开时间大于进入时间才能赋值成功
}
//显示停车场内状况
int displaystats(STACK* S, int pinput) {
    void displayhead();//显示菜单
    int i = 0;
    i = S->top;//i为栈顶位置的数组下标
    switch (pinput)//调用的时候自动填入10000
    {
    case 10000:
        {
        if (!Empty(S))//栈不空
            for (; !(i == -1); i--)//遍历输出栈内停车信息
                printf("<===%d时%d号车停于%d车位===>\n", S->car_time[i], S->car_time[i], i + 1);
        else
            cout << "停车场为空";
        printf("还有车%d个位\n", MaxSize - S->top - 1);//剩余车位等于最大停车位-当前数组下标再-1,因为数组是从0开始
        break;
        }
    default:
        {
        return 1;
        }
    }
    return 0;
}
//功能菜单
void displayhead() {
    cout << '\n' << "<===============CT停车场管理系统===================>" << endl;
    cout << "<==操作说明:  *******  ==>" << endl;
    cout << "<==1: 停车命令 *******  ==>" << endl;
    cout << "<==2: 出车命令  ***  ==>" << endl;
    cout << "<==0: 退出程序  ***  ==>" << endl;
    cout << "<==3:  显示停车场内状况     " << endl;
    cout << "<==============================================>" << endl;
}
//打印收费条
void displayChange(STACK* S, ElemType pnum, int ptime) {
    printf("   (单价 %d元/小时 )\n", fee);//fee在宏定义有,值为2
    printf("<======================电子收据===================>\n");
    printf("<==停车时间:--------------------------%d小时     ==>\n", ptime - tmptime);//停车时长
    printf("<==车牌号码:--------------------------%d         ==>\n", tmpnum);//打印车牌号
    printf("<==应收费用:--------------------------%d  元     ==>\n", (ptime - tmptime) * fee);//计算费用
    printf("<====================谢谢=欢迎下次再来=============>\n");

}
//开走车
int outparkstation(STACK* S1, STACK* TS, ElemType pnum) {
    int t_num = 0;
    int t_time = 0;
    while (1) {
        Pop(S1, &t_num, &t_time);//取出栈顶车
        if (t_num == pnum) {//如果这一次取出的栈顶车的车牌号是我们想开走的
            tmpnum = t_num;//进行车牌号和进入时间的赋值
            tmptime = t_time;
            while (!Empty(TS)) {//当备用停车场不空时
                Pop(TS, &t_num, &t_time);//循环取出备用停车场的暂存栈顶车
                Push(S1, t_num, t_time);//将每次的栈顶车再放进停车场
            }
            return 1;//结束循环
        }
        Push(TS, t_num, t_time);//栈顶不是我们想要的车就暂存再备用停车场
    }
    return 0;
}
//进行停车
int inparkstation(STACK* S) {
    int parknum;
    int parktime;
    printf("还有%d个车位\n", MaxSize - S->top - 1);
    printf("请输入车牌号码:");
    cin >> parknum;//输入车牌号
    while (chackinput(S, parknum)) {//调用检验函数,重复则重新输入车牌号
        printf("车牌号码重复,请输入%d1或者其他", parknum);
        cin >> parknum;//输入车牌号
    }
    printf("请输入停车时间:");
    cin >> parktime;//输入停车时间
    printf("%d号车于%d时停靠在%d位\n", parknum, parktime, S->top + 2);//下标加2是因为初始为-1,第一个车位于一号位,需要加2
    Push(S, parknum, parktime);//将输入的车牌号与进入时间入栈,完成停车
    return 1;
}
//在便道,栈满时将车暂存到便道内
int inbiandao(SQUEUE* SQ, STACK* S) {
    int parknum;
    printf("对不起,停车场已满,请您到便道等待.停车场有空位时您将第");
    printf("%d进入停车场\n", CountQueue(SQ));//调用CountQueue()函数,得到便道内的结点个数
    printf("请输入车牌号码:");
    cin >> parknum;
    while (chackinput(S, parknum)) {//如果有重复车牌号则重新输入
        printf("车牌号码重复,请输入其他车牌号");
        cin >> parknum;
    }
    EnQueue(SQ, parknum, 0);//将车牌号为parknum的车放进便道,进便道时间默认为0
    return 1;
}
//离开停车场
int OutParkingStation(SQUEUE* biandao, STACK* car, STACK* tmp) {
    int parknum = 0;
    int parktime = 0;
    int buf = 0;
    if (!Empty(car)) {//栈不空的情况下
        displaystats(car, 10000);//遍历查看停车场停车情况
        printf("请输入您要调出的车牌号码:");
        cin >> parknum;
        while (!chackinput(car, parknum)) {
            printf("没有您要的%d的车牌号码,请输入正确的车牌号码:", parknum);//没有检查到重新输入
            cin >> parknum;
        }
        outparkstation(car, tmp, parknum);//将车牌号为parknum的车开走
        printf("%d时%d号车进入停车场\n", tmptime, tmpnum);//上一行代码已经给开走的车进入时间和车牌号赋值,
        printf("请输入现在的时间:");//开走时的时间
        cin >> parktime;
        while (!chacktime(car, parktime)) {//开走时间需要大于进入时间,否则重新输入
            cout << "输入时间小于停车时间,请重新输入:";
            cin >> parktime;
        }
        displayChange(car, parknum, parktime);//打印账单
        if (biandao->front != biandao->rear)
        {
            printf("%d号车位空开\n", car->top + 2);//提示开走的车占用的停车场位置空了
            printf("%d时便道上的%d号汽车驶入%d号车位", parktime, biandao->front->next->car_num, car->top + 2);//提示便道队首元素进入停车场
            OutQueue(biandao, &parknum, &buf);//将便道队首元素的车牌号赋值给parknum
            Push(car, parknum, parktime);//将该车进入停车场栈顶,进入成功
        }
        return 2;
    }
    printf("停车场为空\n");//栈空则停车场为空
    return 1;
};

int main() {
   int chance = 0;//用来选择操作
    STACK car;//创建未分配空间的car栈
    InitStack(&car);//初始化,包括分配内存空间
    STACK tmp;//备用栈
    InitStack(&tmp);//初始化
    SQUEUE biandao;//创建队列
    InitQueue(&biandao);//初始化
loop://跳转语句,配和goto语句使用
    while (1) {
        displayhead();//展示菜单
        cout << "=>:";
        cin >> chance;//输入操作的选择
        switch (chance) {
        case 1:
        {
            printf("查询结果为:\n");
            if (Full(&car))//栈未满时执行if,栈满时执行else
                inparkstation(&car);//停进停车场
            else
                inbiandao(&biandao, &car);//停进便道
            break;
        }
        case 2:
        {
            OutParkingStation(&biandao, &car, &tmp);//开走车
            break;
        }
        case 3:
        {
            displaystats(&car, 10000);//查看停车场信息
            break;
        }
        case 0:
        {
            printf("成功退出,欢迎下次使用!");
            return 0;//退出循环
        }
        default:
        {
            cout << "输入错误" << endl;
            goto loop;//goto语句是跳转的意思,跳转到前面的loop位置,即继续选择操作
        }
        }
    }
    system("PAUSE");//终端出现按任意键继续,终端就是显示运行结果的地方
    return 0;
}

以上就是C/C++利用栈和队列实现停车场管理系统的详细内容,更多关于C/C++停车场管理系统的资料请关注我们其它相关文章!

(0)

相关推荐

  • C语言实现简单停车场管理系统

    本文实例为大家分享了C语言停车场管理系统的具体代码,供大家参考,具体内容如下 /*************************************************************************** 项目要求 停车场管理 问题描述:停车场是一个能放n辆车的狭长通道, 只有一个大门,汽车按到达的先后次序停放.若 车场满了,车要停在门外的便道上等候,一旦有 车走,则便道上第一辆车进入.当停车场中的车 离开时,由于通道窄,在它后面的车要先退出, 待它走后再依次进入.汽车

  • C语言版停车位管理系统

    本文实例为大家分享了C语言实现停车位管理系统的具体代码,供大家参考,具体内容如下 简单功能介绍 1.录入车辆信息2.查找车辆信息3.删除车辆信息4.修改车辆信息5.查找区域车辆信息6.排序(按照车主姓名排序)7.展示所有车辆信息8.将录入的数据保存在文件中9.将文件中的数据读出 算法构造 链表的增删改查 结构体的定义 typedef struct Parking {     char name[20];        //车主姓名     char carname[10];     //车牌号

  • C语言课程设计之停车场管理问题

    C语言课程设计之停车场管理问题,供大家参考,具体内容如下 1.问题描述 停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在停车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入:当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每辆停放在车场的车在它

  • C语言实现停车管理系统

    本题为大家分享了C语言实现停车管理系统的具体代码,供大家参考,具体内容如下 设计题目 设停车场是一个可以停放n辆汽车的南北方向的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆车,那么后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入:当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,每

  • C语言实现简易停车场管理系统

    本文实例为大家分享了C语言实现停车场管理系统的具体代码,供大家参考,具体内容如下 问题描述: 设停车场内只有一个可停放n辆汽车的狭长通道,且只有一个大门可供汽车进出.汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入:当停车场内某辆车要离开时,在它之后开入的车辆必须先退出车场为它让路,待该辆车开出大门外,其它车辆再按原次序进入车场,

  • C++实现停车场管理系统

    本文实例为大家分享了停车场管理系统的具体代码,供大家参考,具体内容如下 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cstdlib> #include<algorithm> #include<queue> #include<vector> #include<stack> #includ

  • C/C++利用栈和队列实现停车场管理系统

    目录 纯c语言版 包含的功能 运行效果 源码 c++版 包含的功能 运行效果 源码 纯c语言版 包含的功能 1.停车功能 如果停车场满,能够暂时存放到便道内 2.开走车功能 将指定车开走后打印收据,便道内的车自动停到停车场 3.退出程序功能 运行效果 停车功能测试: 离开停车场并打印收据测试: 源码 #define _CRT_SECURE_NO_WARNINGS//visual stduio添加对scanf的信任 #include<stdio.h> #include <stdlib.h&

  • python 利用栈和队列模拟递归的过程

    一.递归 递归调用:一个函数,调用的自身,称为递归调用 递归函数:一个可以调用自身的函数称为递归函数 凡是循环能干的事,递归都能干 方法: 1.写出临界条件 2.找这一次和上一次的关系 3.假设当前函数已经能用,调用自身计算上一次的结果再求出本次的结果 下面我们通过两段代码简单看一下递归和非递归的区别: 输入一个大于等于1的数,求1到n的和! # 普通函数方法 def hanshu(n): sum = 0 # 循环遍历每一个数字,将他们加到一个事先定义好的变量上,直到加完 for x in ra

  • JS实现利用两个队列表示一个栈的方法

    本文实例讲述了JS实现利用两个队列表示一个栈的方法.分享给大家供大家参考,具体如下: 先看原理图: 理清楚思路,再动笔写: <!DOCTYPE html> <html> <head> <title>2 Queue</title> <meta charset="utf-8"/> <script type="text/javascript"> var arr1 = []; var arr

  • C#数据结构与算法揭秘五 栈和队列

    这节我们讨论了两种好玩的数据结构,栈和队列. 老样子,什么是栈, 所谓的栈是栈(Stack)是操作限定在表的尾端进行的线性表.表尾由于要进行插入.删除等操作,所以,它具有特殊的含义,把表尾称为栈顶(Top) ,另一端是固定的,叫栈底(Bottom) .当栈中没有数据元素时叫空栈(Empty Stack).这个类似于送饭的饭盒子,上层放的是红烧肉,中层放的水煮鱼,下层放的鸡腿.你要把这些菜取出来,这就引出来了栈的特点先进后出(First in last out).   具体叙述,加下图. 栈通常记

  • Java实现栈和队列面试题

    面试的时候,栈和队列经常会成对出现来考察.本文包含栈和队列的如下考试内容: (1)栈的创建 (2)队列的创建 (3)两个栈实现一个队列 (4)两个队列实现一个栈 (5)设计含最小函数min()的栈,要求min.push.pop.的时间复杂度都是O(1) (6)判断栈的push和pop序列是否一致 1.栈的创建: 我们接下来通过链表的形式来创建栈,方便扩充. 代码实现: public class Stack { public Node head; public Node current; //方法

  • C语言中栈和队列实现表达式求值的实例

    C语言中栈和队列实现表达式求值的实例 实现代码: #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define STACK_SIZE 20 #define STACK_INCREMENT 10 #define QUEUE_SIZE 20 typedef int Status; typedef char StackElemtype; typedef struct Stack{ StackElemty

  • Java数据结构学习之栈和队列

    一.栈 1.1 概述 Java为什么要有集合类: 临时存储数据. 链表的本质: 对象间通过持有和引用关系互相关联起来. 线性表: 普通线性表, 操作受限线性表(某些操作受到限制 --> 某一个线性表它的增删改操作受到限制) --> 栈 & 队列 1.1.1 线性表的概念 (1)线性表:n个数据元素的有序序列. ①首先,线性表中元素的个数是有限的. ②其次,线性表中元素是有序的. (2)那这个"序"指的是什么呢? ①除表头和表尾元素外,其它元素都有唯一前驱和唯一后继,

  • C语言基于考研的栈和队列

    目录 栈 栈的基本操作 三角矩阵 总结 栈 栈的基本操作 InitStack(&S):初始化 StackEmpty(S):判空,空则true,非空则false Push(&S,x):入栈 Pop(&S,&x):出栈,并用x返回元素内容 GetTop(S,&x):读栈顶元素 DestroyStack(&S):销毁并释放空间 栈是一种受限的线性表,只允许在一端操作 栈若只能在栈顶操作,则只可能上溢 采用非递归方式重写递归时,不一定要用栈,比如菲波那切数列只要用循

  • python数据结构之栈、队列及双端队列

    目录 1.线性数据结构的定义 2.栈 2.1 栈的定义 2.2 栈的数据类型 2.3 用python实现栈 2.4 栈的应用 3. 队列 3.1 队列的定义 3.2 队列抽象数据类型 3.3 用python实现队列 3.3 队列的应用 4. 双端队列 4.1 双端队列的定义 4.2 双端队列抽象数据类型 4.3 用python实现双端队列 4.3 双端队列的应用 5.链表 5.1 链表定义 5.2 用python实现链表 前文学习: python数据类型: python数据结构:数据类型. py

  • C语言栈与队列面试题详解

    目录 1.括号匹配问题 2.用队列实现栈 3.用栈实现队列 4.设计循环队列 1.括号匹配问题 链接直达: 有效的括号 题目: 思路: 做题前,得先明确解题方案是啥,此题用栈的思想去解决是较为方便的,栈明确指出后进先出.我们可以这样设定: 遇到左括号“ ( ”.“ [ ”.“ { ”,入栈. 遇到右括号“ ) ”.“ ] ”.“ } ”,出栈,跟左括号进行匹配,不匹配就报错. 上两句话的意思就是说我去遍历字符串,如果遇到左括号,就入栈:遇到右括号,就出栈顶元素,并判断这个右括号是否与栈顶括号相匹

随机推荐