小小小小小小宇 2014-01-04 18:06 采纳率: 0%
浏览 1141

数据结构关于双向栈的问题

我自己做的小程序 是一个停车管理系统 我把相关的数据结构的定义和函数的定义发下 求大家帮忙看看,是不是我定义的有问题,运行出现问题,大概是在进栈出栈上出现的问题,谢谢大家啦~~

typedef struct ds_Car //地上停车场车辆
{
int number; //车号
int hour; //到达的小时
int minute; //到达的分钟
}ds_CarNode;
typedef struct //地上停车场(采用双向栈)
{
ds_CarNode base[2]; // 0和1分别表示低端和高端栈顶和栈底
ds_CarNode *top[2];
int stacksize;//当前的车数
}ds_Park;
Status InitDStack(ds_Park &p)//构造一个空的双向栈
{
p.base[0]=(ds_CarNode
)malloc(DSPARKSIZE*sizeof(ds_Car));//为双向栈分配内存
if(!p.base)
exit(OVERFLOW);
p.base[1]=p.base[0]+DSPARKSIZE;
p.top[0]=p.base[0];
p.top[1]=p.top[1];
p.stacksize=0; //当前停的车辆数
return OK;
}
Status DPush(ds_Park &p,ds_CarNode e,int choice)//进栈 choice为从左右哪边进栈
{
if(p.top[0]>p.top[1])
printf("地上停车场已满!\n");
if(choice==0)
{
p.stacksize++;
p.top[0]++=e;
}
if(choice==1)
{
p.stacksize++;
*p.top[1]--=e;
}
return OK;
}
Status DPop(ds_Park &p,ds_CarNode e,int choice)//出栈 choice为从左右哪边出栈
{
if((p.top[0]==p.base[0])&&(p.top[1]==p.base[1]))
printf("地上停车场为空!\n");
if(choice==0)
{
p.stacksize--;
e=
--p.top[0];
}
if(choice==1)
{
p.stacksize--;
e=*++p.top[1];
}
return OK;
}

//地上停车场的离开
Status DSLeave(ds_Park &p1,ds_Park &p2,wait_Line &q1,wait_Line &q2)
{
int number,hour,minute;
int leave_hour,leave_minute;
int choice;
int flag=1; //用来实现是否退出循环
double money=0;
printf("请输入车牌号:\n");
scanf("%d",&number);
printf("离开停车场的小时:\n");
scanf("%d",&leave_hour);
printf("离开停车场的分钟:\n");
scanf("%d",&leave_minute);
printf("从哪个出口离开?(0\1)\n");
scanf("%d",&choice);
ds_CarNode e,m;
CarPtr w;
while(flag)
{
DPop(p1,e,choice);
DPush(p2,e,choice);
if(e.number==number)
{
flag=0;
int a=leave_hour-e.hour;
int b=leave_minute-e.minute;
money=((a*60+b)/60)*PRICE;
hour=e.hour;
minute=e.minute;
}
}
DPop(p2,e,choice);
while(p2.stacksize)
{
DPop(p2,e,choice);
DPush(p1,e,choice);
}
if(p1.stacksize {
if(q1.length!=0)
{
DeQueue(q1,w);
m.hour=leave_hour;
m.minute=leave_minute;
m.number=w->number;
DPush(p1,m,choice);
printf("车牌号为%d的车已由等候队列进入停车场,停车位为%d\n",m.number,p1.stacksize);
}
if(q2.length!=0)
{
DeQueue(q2,w);
m.hour=leave_hour;
m.minute=leave_minute;
m.number=w->number;
DPush(p1,m,choice);
printf("车牌号为%d的车已由等候队列进入停车场,停车位为%d\n",m.number,p1.stacksize);
}
}
printf("停车费为%lf\n欢迎下次光临!",money);
return OK;
}

  • 写回答

1条回答

  • 憧憬blog 2023-06-27 09:50
    关注

    根据您提供的代码,我发现在 InitDStack 函数中有一个错误:

    p.top[1]=p.top[1];
    

    应该改为:

    p.top[1]=p.base[1];
    

    这个错误会导致 p.top[1] 未被正确初始化,可能会影响双向栈的正常操作。

    此外,在 DPop 函数中,应该将 e 定义为指针类型,否则无法将出栈的元素传出函数。修改后的代码如下:

    Status DPop(ds_Park &p,ds_CarNode *e,int choice)//出栈 choice为从左右哪边出栈
    {
        if((p.top[0]==p.base[0])&&(p.top[1]==p.base[1]))
            printf("地上停车场为空!\n");
        if(choice==0)
        {
            p.stacksize--;
            *e=--p.top[0];
        }
        if(choice==1)
        {
            p.stacksize--;
            *e=*++p.top[1];
        }
        return OK;
    }
    

    此外,您的代码中还缺少了 DeQueue 函数的定义,因此无法确定该函数是否正确实现。如果您遇到了运行时的问题,请检查 DeQueue 函数的实现是否正确。

    最后,还有一些细节问题需要注意,例如在 DPush 函数中,应该分别判断左右两个栈是否已满,而不是判断整个双向栈是否已满。在 DSLeave 函数中,应该在计算停车费用时,先判断车辆是否在停车场内,如果不在停车场内则无需计费。另外,应该在从等候队列中取出车辆后,将等候队列的长度减一。

    评论

报告相同问题?

悬赏问题

  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?