小小小小小小宇 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 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题