鱼C论坛

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

[已解决]1

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

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

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

x
这段代码无法正确的出栈入栈,请各位帮忙看看,是哪里出了问题。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define stack_init_size 100
  4. #define stackincrement 10
  5. #define OK 1
  6. #define ERROR 0
  7. typedef int status;
  8. typedef struct            //声明结构体Production用于表示生产日期
  9. {   int year;
  10.     int month;
  11.     int day;
  12. }production;
  13. typedef struct
  14. {    int  number;                  //商品编号
  15.          production date;           //商品生产日期
  16. }selemtype;
  17. typedef struct{
  18.         selemtype *base;//栈底指针
  19.         selemtype *top;//栈顶指针
  20.         int stacksize;
  21. }sqstack;
  22. void initstack(sqstack &s)
  23. {
  24.         s.base=(selemtype*)malloc(stack_init_size*sizeof(selemtype));
  25.         s.top=s.base;
  26.         s.stacksize=stack_init_size;
  27. }
  28. void push(sqstack &s,selemtype e)//入栈
  29. {
  30.         if(s.top-s.base>=s.stacksize){
  31.                 s.base=(selemtype*)realloc(s.base,(s.stacksize+stack_init_size)*sizeof(selemtype));
  32.                 if(!s.base)  
  33.                        printf("error");
  34.                            s.top=s.base+s.stacksize;
  35.                            s.stacksize+=stack_init_size;
  36.         }
  37.         *s.top=e;
  38.         s.top++;
  39. }
  40. void pop(sqstack &s,selemtype k)//出栈
  41. {
  42.         int i=0;
  43.         if(s.base==s.top){
  44.                 printf("栈为空");
  45.         }
  46.         s.top--;
  47.         k=*s.top;
  48.        
  49. }
  50. status gettop(sqstack s,selemtype k)//取栈顶元素
  51. {
  52.         selemtype e;
  53.         if(s.top!=s.base){
  54.       k=*(s.top-1);
  55.           return OK;
  56.         }
  57.         return ERROR;
  58. }
  59. void print(sqstack &s)//输出
  60. {
  61.         selemtype *e=s.base;
  62.         int i=0;
  63.         while(i<(s.top-s.base))
  64.         {
  65.                 printf("%d ",*e);
  66.                 i++;
  67.                 e++;
  68.         }
  69. }
  70. status judge(sqstack &s,selemtype e)//栈顶元素大于输入返回1
  71. {
  72.         selemtype k;
  73.         gettop(s,k);
  74.         if(k.date.year>e.date.year){
  75.                 return OK;
  76.         }
  77.         else if(k.date.year==e.date.year){
  78.                 if(k.date.month>e.date.month){
  79.                         return OK;}
  80.                 else if(k.date.month==e.date.month){
  81.                         if(k.date.day>e.date.day){
  82.                                 return OK;
  83.                         }
  84.                         else if(k.date.day==e.date.day){
  85.                                 return OK;
  86.                         }
  87.                 }
  88.                 }
  89.         else {
  90.                 return ERROR;
  91.         }
  92. }
  93. void Lineup()
  94. {
  95.         int i,j=1,t;
  96.         sqstack s,temp;
  97.         initstack(s);
  98.         initstack(temp);
  99.         while(j!=4)
  100.         {
  101.                 printf("1.入库  2.出库  3.查看货物   4.退出\n");
  102.                 scanf("%d",&j);
  103.                 switch(j){
  104.                         case 1:{
  105.                                         selemtype e,k;
  106.                                         printf("请输入商品编号及生产日期:\n");
  107.                                    scanf("%d %d %d %d",&e.number,&e.date.year,&e.date.month,&e.date.day);
  108.                                         if(s.top==s.base)
  109.                                         {
  110.                                                 push(s,e);
  111.                                         }
  112.                                         else{
  113.                                                         gettop(s,k);
  114.                                                         t=0;
  115.                                                         while(!t){
  116.                                                                 pop(s,k);
  117.                                                                 push(temp,k);
  118.                                                                 t=judge(s,e);
  119.                                                         }
  120.                                                         push(s,e);
  121.                                                         while(temp.base!=temp.top)
  122.                                                         {
  123.                                                                 pop(temp,k);
  124.                                                                 push(s,k);
  125.                                                         }
  126.                                                 }
  127.                                                 break;}
  128.                         case 2: {
  129.                                          selemtype w;
  130.                                      pop(s,w);
  131.                                          printf("该商品编号为%d,生产日期为%d %d %d\n",w.number,w.date.year,w.date.month,w.date.day);
  132.                                          break;}
  133.                     case 3:{
  134.                                         print(s);
  135.                                         break;}
  136.                 }
  137.                 }
  138.         }
  139. int main()
  140. {
  141.         Lineup();
  142.     return 0;
  143. }
复制代码
最佳答案
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  进行比较。

下面是修复后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define stack_init_size 100
  4. #define stackincrement 10
  5. #define OK 1
  6. #define ERROR 0

  7. typedef int status;

  8. typedef struct //声明结构体Production用于表示生产日期
  9. {
  10.     int year;
  11.     int month;
  12.     int day;
  13. } production;

  14. typedef struct
  15. {
  16.     int number; //商品编号
  17.     production date; //商品生产日期
  18. } selemtype;

  19. typedef struct
  20. {
  21.     selemtype *base; //栈底指针
  22.     selemtype *top; //栈顶指针
  23.     int stacksize;
  24. } sqstack;

  25. void initstack(sqstack &s)
  26. {
  27.     s.base = (selemtype *)malloc(stack_init_size * sizeof(selemtype));
  28.     s.top = s.base;
  29.     s.stacksize = stack_init_size;
  30. }

  31. void push(sqstack &s, selemtype e) //入栈
  32. {
  33.     if (s.top - s.base >= s.stacksize)
  34.     {
  35.         selemtype *newbase = (selemtype *)realloc(s.base, (s.stacksize + stackincrement) * sizeof(selemtype));
  36.         if (!newbase)
  37.         {
  38.             printf("error");
  39.             return;
  40.         }
  41.         s.base = newbase;
  42.         s.top = s.base + s.stacksize;
  43.         s.stacksize += stackincrement;
  44.     }
  45.     *s.top = e;
  46.     s.top++;
  47. }

  48. void pop(sqstack &s, selemtype &k) //出栈
  49. {
  50.     if (s.base == s.top)
  51.     {
  52.         printf("栈为空");
  53.         return;
  54.     }
  55.     s.top--;
  56.     k = *s.top;
  57. }

  58. status gettop(sqstack s, selemtype &k) //取栈顶元素
  59. {
  60.     if (s.top != s.base)
  61.     {
  62.         k = *(s.top - 1);
  63.         return OK;
  64.     }
  65.     return ERROR;
  66. }

  67. void print(sqstack &s) //输出
  68. {
  69.     selemtype *e = s.base;
  70.     int i = 0;
  71.     while (e < s.top)
  72.     {
  73.         printf("%d ", e->number);
  74.         i++;
  75.         e++;
  76.     }
  77. }

  78. status judge(sqstack &s, selemtype e) //栈顶元素大于输入返回1
  79. {
  80.     selemtype k;
  81.     gettop(s, k);
  82.     if (k.date.year > e.date.year)
  83.     {
  84.         return OK;
  85.     }
  86.     else if (k.date.year == e.date.year)
  87.     {
  88.         if (k.date.month > e.date.month)
  89.         {
  90.             return OK;
  91.         }
  92.         else if (k.date.month == e.date.month)
  93.         {
  94.             if (k.date.day > e.date.day)
  95.             {
  96.                 return OK;
  97.             }
  98.             else if (k.date.day == e.date.day)
  99.             {
  100.                 return OK;
  101.             }
  102.         }
  103.     }
  104.     return ERROR;
  105. }

  106. void Lineup()
  107. {
  108.     int j = 1, t;
  109.     sqstack s, temp;
  110.     initstack(s);
  111.     initstack(temp);
  112.     while (j != 4)
  113.     {
  114.         printf("1.入库  2.出库  3.查看货物  4.退出\n");
  115.         scanf("%d", &j);
  116.         switch (j)
  117.         {
  118.         case 1:
  119.         {
  120.             selemtype e, k;
  121.             printf("请输入商品编号及生产日期:\n");
  122.             scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
  123.             if (s.top == s.base)
  124.             {
  125.                 push(s, e);
  126.             }
  127.             else
  128.             {
  129.                 gettop(s, k);
  130.                 t = 0;
  131.                 while (!t)
  132.                 {
  133.                     pop(s, k);
  134.                     push(temp, k);
  135.                     t = judge(s, e);
  136.                 }
  137.                 push(s, e);
  138.                 while (temp.base != temp.top)
  139.                 {
  140.                     pop(temp, k);
  141.                     push(s, k);
  142.                 }
  143.             }
  144.             break;
  145.         }
  146.         case 2:
  147.         {
  148.             selemtype w;
  149.             pop(s, w);
  150.             printf("该商品编号为%d,生产日期为%d %d %d\n", w.number, w.date.year, w.date.month, w.date.day);
  151.             break;
  152.         }
  153.         case 3:
  154.         {
  155.             print(s);
  156.             break;
  157.         }
  158.         }
  159.     }
  160. }

  161. int main()
  162. {
  163.     Lineup();
  164.     return 0;
  165. }
复制代码


希望以上解答对您有帮助。如果您还有任何问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> 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  进行比较。

下面是修复后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define stack_init_size 100
  4. #define stackincrement 10
  5. #define OK 1
  6. #define ERROR 0

  7. typedef int status;

  8. typedef struct //声明结构体Production用于表示生产日期
  9. {
  10.     int year;
  11.     int month;
  12.     int day;
  13. } production;

  14. typedef struct
  15. {
  16.     int number; //商品编号
  17.     production date; //商品生产日期
  18. } selemtype;

  19. typedef struct
  20. {
  21.     selemtype *base; //栈底指针
  22.     selemtype *top; //栈顶指针
  23.     int stacksize;
  24. } sqstack;

  25. void initstack(sqstack &s)
  26. {
  27.     s.base = (selemtype *)malloc(stack_init_size * sizeof(selemtype));
  28.     s.top = s.base;
  29.     s.stacksize = stack_init_size;
  30. }

  31. void push(sqstack &s, selemtype e) //入栈
  32. {
  33.     if (s.top - s.base >= s.stacksize)
  34.     {
  35.         selemtype *newbase = (selemtype *)realloc(s.base, (s.stacksize + stackincrement) * sizeof(selemtype));
  36.         if (!newbase)
  37.         {
  38.             printf("error");
  39.             return;
  40.         }
  41.         s.base = newbase;
  42.         s.top = s.base + s.stacksize;
  43.         s.stacksize += stackincrement;
  44.     }
  45.     *s.top = e;
  46.     s.top++;
  47. }

  48. void pop(sqstack &s, selemtype &k) //出栈
  49. {
  50.     if (s.base == s.top)
  51.     {
  52.         printf("栈为空");
  53.         return;
  54.     }
  55.     s.top--;
  56.     k = *s.top;
  57. }

  58. status gettop(sqstack s, selemtype &k) //取栈顶元素
  59. {
  60.     if (s.top != s.base)
  61.     {
  62.         k = *(s.top - 1);
  63.         return OK;
  64.     }
  65.     return ERROR;
  66. }

  67. void print(sqstack &s) //输出
  68. {
  69.     selemtype *e = s.base;
  70.     int i = 0;
  71.     while (e < s.top)
  72.     {
  73.         printf("%d ", e->number);
  74.         i++;
  75.         e++;
  76.     }
  77. }

  78. status judge(sqstack &s, selemtype e) //栈顶元素大于输入返回1
  79. {
  80.     selemtype k;
  81.     gettop(s, k);
  82.     if (k.date.year > e.date.year)
  83.     {
  84.         return OK;
  85.     }
  86.     else if (k.date.year == e.date.year)
  87.     {
  88.         if (k.date.month > e.date.month)
  89.         {
  90.             return OK;
  91.         }
  92.         else if (k.date.month == e.date.month)
  93.         {
  94.             if (k.date.day > e.date.day)
  95.             {
  96.                 return OK;
  97.             }
  98.             else if (k.date.day == e.date.day)
  99.             {
  100.                 return OK;
  101.             }
  102.         }
  103.     }
  104.     return ERROR;
  105. }

  106. void Lineup()
  107. {
  108.     int j = 1, t;
  109.     sqstack s, temp;
  110.     initstack(s);
  111.     initstack(temp);
  112.     while (j != 4)
  113.     {
  114.         printf("1.入库  2.出库  3.查看货物  4.退出\n");
  115.         scanf("%d", &j);
  116.         switch (j)
  117.         {
  118.         case 1:
  119.         {
  120.             selemtype e, k;
  121.             printf("请输入商品编号及生产日期:\n");
  122.             scanf("%d %d %d %d", &e.number, &e.date.year, &e.date.month, &e.date.day);
  123.             if (s.top == s.base)
  124.             {
  125.                 push(s, e);
  126.             }
  127.             else
  128.             {
  129.                 gettop(s, k);
  130.                 t = 0;
  131.                 while (!t)
  132.                 {
  133.                     pop(s, k);
  134.                     push(temp, k);
  135.                     t = judge(s, e);
  136.                 }
  137.                 push(s, e);
  138.                 while (temp.base != temp.top)
  139.                 {
  140.                     pop(temp, k);
  141.                     push(s, k);
  142.                 }
  143.             }
  144.             break;
  145.         }
  146.         case 2:
  147.         {
  148.             selemtype w;
  149.             pop(s, w);
  150.             printf("该商品编号为%d,生产日期为%d %d %d\n", w.number, w.date.year, w.date.month, w.date.day);
  151.             break;
  152.         }
  153.         case 3:
  154.         {
  155.             print(s);
  156.             break;
  157.         }
  158.         }
  159.     }
  160. }

  161. int main()
  162. {
  163.     Lineup();
  164.     return 0;
  165. }
复制代码


希望以上解答对您有帮助。如果您还有任何问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> 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-4-28 05:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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