鱼C论坛

 找回密码
 立即注册
查看: 734|回复: 2

[已解决]1

[复制链接]
发表于 2023-11-1 18:17:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这段代码无法正确的出栈入栈,请各位帮忙看看,是哪里出了问题。
#include<stdio.h>
#include<stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1 
#define ERROR 0
typedef int status;
typedef struct            //声明结构体Production用于表示生产日期
{   int year;
    int month;
    int day;
}production;
typedef struct
{    int  number;                  //商品编号
         production date;           //商品生产日期
}selemtype;
typedef struct{
        selemtype *base;//栈底指针 
        selemtype *top;//栈顶指针 
        int stacksize;
}sqstack;
void initstack(sqstack &s)
{
        s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
        s.top=s.base;
        s.stacksize=stack_init_size;
}
void push(sqstack &s,selemtype e)//入栈 
{
        if(s.top-s.base>=s.stacksize){
                s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
                if(!s.base)  
                       printf("error");
                           s.top=s.base+s.stacksize;
                           s.stacksize+=stack_init_size;
        }
        *s.top=e;
        s.top++;
}
void pop(sqstack &s,selemtype k)//出栈 
{
        int i=0;
        if(s.base==s.top){
                printf("栈为空"); 
        }
        s.top--;
        k=*s.top;
        
}
status gettop(sqstack s,selemtype k)//取栈顶元素 
{
        selemtype e;
        if(s.top!=s.base){
      k=*(s.top-1);
          return OK;
        }
        return ERROR;
}
void print(sqstack &s)//输出 
{
        selemtype *e=s.base;
        int i=0;
        while(i<(s.top-s.base))
        {
                printf("%d ",*e);
                i++;
                e++;
        }
}
status judge(sqstack &s,selemtype e)//栈顶元素大于输入返回1 
{
        selemtype k;
        gettop(s,k);
        if(k.date.year>e.date.year){
                return OK;
        }
        else if(k.date.year==e.date.year){
                if(k.date.month>e.date.month){
                        return OK;}
                else if(k.date.month==e.date.month){
                        if(k.date.day>e.date.day){
                                return OK;
                        }
                        else if(k.date.day==e.date.day){
                                return OK;
                        }
                }
                }
        else {
                return ERROR;
        }
}
void Lineup()
{
        int i,j=1,t;
        sqstack s,temp;
        initstack(s);
        initstack(temp);
        while(j!=4)
        {
                printf("1.入库  2.出库  3.查看货物   4.退出\n");
                scanf("%d",&j);
                switch(j){
                        case 1:{
                                        selemtype e,k;
                                        printf("请输入商品编号及生产日期:\n");
                                   scanf("%d %d %d %d",&e.number,&e.date.year,&e.date.month,&e.date.day);
                                        if(s.top==s.base)
                                        {
                                                push(s,e);
                                        }
                                        else{
                                                        gettop(s,k);
                                                        t=0;
                                                        while(!t){
                                                                pop(s,k);
                                                                push(temp,k);
                                                                t=judge(s,e);
                                                        }
                                                        push(s,e);
                                                        while(temp.base!=temp.top)
                                                        {
                                                                pop(temp,k);
                                                                push(s,k);
                                                        }
                                                }
                                                break;}
                        case 2: {
                                         selemtype w;
                                     pop(s,w);
                                         printf("该商品编号为%d,生产日期为%d %d %d\n",w.number,w.date.year,w.date.month,w.date.day);
                                         break;}
                    case 3:{
                                        print(s);
                                        break;}
                }
                }
        }
int main()
{
        Lineup();
    return 0;
}
最佳答案
2023-11-1 18:17:57
这段代码中存在以下问题:

1. 在使用结构体指针作为栈底和栈顶指针时,需要先为其分配内存空间。在  initstack  函数中,应该使用  s.base = (selemtype*)malloc(stack_init_size*sizeof(selemtype))  分配内存空间。

2. 在  push  函数中,当栈已满时,需要重新分配更大的内存空间。但是代码中的重新分配内存的逻辑有问题。正确的逻辑应该是先判断是否分配成功,然后再更新栈顶指针和栈大小。

3. 在  pop  函数中,应该将栈顶元素赋值给参数  k ,而不是将参数  k  赋值给栈顶元素。

4. 在  gettop  函数中,应该将栈顶元素赋值给参数  k ,而不是将参数  k  赋值给栈顶元素。

5. 在  print  函数中,应该打印栈中元素的编号,而不是打印指针的值。

6. 在  judge  函数中,应该将参数  e  的日期与栈顶元素  k  的日期进行比较,而不是将栈顶元素  k  的日期与参数  e  进行比较。

下面是修复后的代码:
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0

typedef int status;

typedef struct //声明结构体Production用于表示生产日期
{
    int year;
    int month;
    int day;
} production;

typedef struct
{
    int number; //商品编号
    production date; //商品生产日期
} selemtype;

typedef struct
{
    selemtype *base; //栈底指针
    selemtype *top; //栈顶指针
    int stacksize;
} sqstack;

void initstack(sqstack &s)
{
    s.base = (selemtype *)malloc(stack_init_size * sizeof(selemtype));
    s.top = s.base;
    s.stacksize = stack_init_size;
}

void push(sqstack &s, selemtype e) //入栈
{
    if (s.top - s.base >= s.stacksize)
    {
        selemtype *newbase = (selemtype *)realloc(s.base, (s.stacksize + stackincrement) * sizeof(selemtype));
        if (!newbase)
        {
            printf("error");
            return;
        }
        s.base = newbase;
        s.top = s.base + s.stacksize;
        s.stacksize += stackincrement;
    }
    *s.top = e;
    s.top++;
}

void pop(sqstack &s, selemtype &k) //出栈
{
    if (s.base == s.top)
    {
        printf("栈为空");
        return;
    }
    s.top--;
    k = *s.top;
}

status gettop(sqstack s, selemtype &k) //取栈顶元素
{
    if (s.top != s.base)
    {
        k = *(s.top - 1);
        return OK;
    }
    return ERROR;
}

void print(sqstack &s) //输出
{
    selemtype *e = s.base;
    int i = 0;
    while (e < s.top)
    {
        printf("%d ", e->number);
        i++;
        e++;
    }
}

status judge(sqstack &s, selemtype e) //栈顶元素大于输入返回1
{
    selemtype k;
    gettop(s, k);
    if (k.date.year > e.date.year)
    {
        return OK;
    }
    else if (k.date.year == e.date.year)
    {
        if (k.date.month > e.date.month)
        {
            return OK;
        }
        else if (k.date.month == e.date.month)
        {
            if (k.date.day > e.date.day)
            {
                return OK;
            }
            else if (k.date.day == e.date.day)
            {
                return OK;
            }
        }
    }
    return ERROR;
}

void Lineup()
{
    int j = 1, t;
    sqstack s, temp;
    initstack(s);
    initstack(temp);
    while (j != 4)
    {
        printf("1.入库  2.出库  3.查看货物  4.退出\n");
        scanf("%d", &j);
        switch (j)
        {
        case 1:
        {
            selemtype e, k;
            printf("请输入商品编号及生产日期:\n");
            scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
            if (s.top == s.base)
            {
                push(s, e);
            }
            else
            {
                gettop(s, k);
                t = 0;
                while (!t)
                {
                    pop(s, k);
                    push(temp, k);
                    t = judge(s, e);
                }
                push(s, e);
                while (temp.base != temp.top)
                {
                    pop(temp, k);
                    push(s, k);
                }
            }
            break;
        }
        case 2:
        {
            selemtype w;
            pop(s, w);
            printf("该商品编号为%d,生产日期为%d %d %d\n", w.number, w.date.year, w.date.month, w.date.day);
            break;
        }
        case 3:
        {
            print(s);
            break;
        }
        }
    }
}

int main()
{
    Lineup();
    return 0;
}

希望以上解答对您有帮助。如果您还有任何问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 18:17:57 | 显示全部楼层    本楼为最佳答案   
这段代码中存在以下问题:

1. 在使用结构体指针作为栈底和栈顶指针时,需要先为其分配内存空间。在  initstack  函数中,应该使用  s.base = (selemtype*)malloc(stack_init_size*sizeof(selemtype))  分配内存空间。

2. 在  push  函数中,当栈已满时,需要重新分配更大的内存空间。但是代码中的重新分配内存的逻辑有问题。正确的逻辑应该是先判断是否分配成功,然后再更新栈顶指针和栈大小。

3. 在  pop  函数中,应该将栈顶元素赋值给参数  k ,而不是将参数  k  赋值给栈顶元素。

4. 在  gettop  函数中,应该将栈顶元素赋值给参数  k ,而不是将参数  k  赋值给栈顶元素。

5. 在  print  函数中,应该打印栈中元素的编号,而不是打印指针的值。

6. 在  judge  函数中,应该将参数  e  的日期与栈顶元素  k  的日期进行比较,而不是将栈顶元素  k  的日期与参数  e  进行比较。

下面是修复后的代码:
#include <stdio.h>
#include <stdlib.h>
#define stack_init_size 100
#define stackincrement 10
#define OK 1
#define ERROR 0

typedef int status;

typedef struct //声明结构体Production用于表示生产日期
{
    int year;
    int month;
    int day;
} production;

typedef struct
{
    int number; //商品编号
    production date; //商品生产日期
} selemtype;

typedef struct
{
    selemtype *base; //栈底指针
    selemtype *top; //栈顶指针
    int stacksize;
} sqstack;

void initstack(sqstack &s)
{
    s.base = (selemtype *)malloc(stack_init_size * sizeof(selemtype));
    s.top = s.base;
    s.stacksize = stack_init_size;
}

void push(sqstack &s, selemtype e) //入栈
{
    if (s.top - s.base >= s.stacksize)
    {
        selemtype *newbase = (selemtype *)realloc(s.base, (s.stacksize + stackincrement) * sizeof(selemtype));
        if (!newbase)
        {
            printf("error");
            return;
        }
        s.base = newbase;
        s.top = s.base + s.stacksize;
        s.stacksize += stackincrement;
    }
    *s.top = e;
    s.top++;
}

void pop(sqstack &s, selemtype &k) //出栈
{
    if (s.base == s.top)
    {
        printf("栈为空");
        return;
    }
    s.top--;
    k = *s.top;
}

status gettop(sqstack s, selemtype &k) //取栈顶元素
{
    if (s.top != s.base)
    {
        k = *(s.top - 1);
        return OK;
    }
    return ERROR;
}

void print(sqstack &s) //输出
{
    selemtype *e = s.base;
    int i = 0;
    while (e < s.top)
    {
        printf("%d ", e->number);
        i++;
        e++;
    }
}

status judge(sqstack &s, selemtype e) //栈顶元素大于输入返回1
{
    selemtype k;
    gettop(s, k);
    if (k.date.year > e.date.year)
    {
        return OK;
    }
    else if (k.date.year == e.date.year)
    {
        if (k.date.month > e.date.month)
        {
            return OK;
        }
        else if (k.date.month == e.date.month)
        {
            if (k.date.day > e.date.day)
            {
                return OK;
            }
            else if (k.date.day == e.date.day)
            {
                return OK;
            }
        }
    }
    return ERROR;
}

void Lineup()
{
    int j = 1, t;
    sqstack s, temp;
    initstack(s);
    initstack(temp);
    while (j != 4)
    {
        printf("1.入库  2.出库  3.查看货物  4.退出\n");
        scanf("%d", &j);
        switch (j)
        {
        case 1:
        {
            selemtype e, k;
            printf("请输入商品编号及生产日期:\n");
            scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
            if (s.top == s.base)
            {
                push(s, e);
            }
            else
            {
                gettop(s, k);
                t = 0;
                while (!t)
                {
                    pop(s, k);
                    push(temp, k);
                    t = judge(s, e);
                }
                push(s, e);
                while (temp.base != temp.top)
                {
                    pop(temp, k);
                    push(s, k);
                }
            }
            break;
        }
        case 2:
        {
            selemtype w;
            pop(s, w);
            printf("该商品编号为%d,生产日期为%d %d %d\n", w.number, w.date.year, w.date.month, w.date.day);
            break;
        }
        case 3:
        {
            print(s);
            break;
        }
        }
    }
}

int main()
{
    Lineup();
    return 0;
}

希望以上解答对您有帮助。如果您还有任何问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-1 18:18:48 | 显示全部楼层
在这段代码中,出栈和取栈顶元素的函数都存在问题,具体如下:

1. 出栈函数pop()的问题:

在函数pop()中,参数k是用于存储出栈元素的,但是在函数中并没有使用到k来修改传入的实参,因此无法正确地出栈。应该改为使用指针作为参数,并且通过指针返回出栈元素。

修改后的pop()函数代码如下:

[/code]
void pop(sqstack &s, selemtype* k) //出栈
{
    if(s.base == s.top){
        printf("栈为空");
    }
    s.top--;
    *k = *s.top;
}
[/code]

2. 取栈顶元素函数gettop()的问题:

在函数gettop()中,参数k是用于存储栈顶元素的,但是在函数中并没有使用到k来修改传入的实参,因此无法正确地取栈顶元素。应该改为使用指针作为参数,并且通过指针返回栈顶元素。

修改后的gettop()函数代码如下:

[/code]
status gettop(sqstack s, selemtype* k) //取栈顶元素
{
    if(s.top != s.base){
        *k = *(s.top-1);
        return OK;
    }
    return ERROR;
}
[/code]

另外,代码中的print()函数也存在问题,因为它试图输出selemtype类型的整数成员number,而应该输出整个结构体的内容。应将print()函数的参数改为selemtype类型的指针,并输出结构体的三个成员。

修改后的print()函数代码如下:

[/code]
void print(sqstack &s) //输出
{
    selemtype* e = s.base;
    int i = 0;
    while(i < (s.top - s.base))
    {
        printf("%d %d.%d.%d\n", e->number, e->date.year, e->date.month, e->date.day);
        i++;
        e++;
    }
}
[/code]

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表