【问题标题】:Sorting a stack in descending order按降序对堆栈进行排序
【发布时间】:2016-08-30 15:28:20
【问题描述】:

我在按降序排序堆栈时遇到问题,排序是在另一个堆栈的帮助下进行的。

这里是排序代码:

void* sort(stack_type* stack, stack_type* auxiliary) {
  int* element = NULL;
  while(!is_empty(stack)) {
    element = pop(stack);
    while(!is_empty(auxiliary) && head(auxiliary) > element) {
      push(pop(auxiliary), stack);
    }
    push(element, auxiliary);
  }
}

输出如下:

|   -4  |
|   -45 |
|   356 |
|   87  |
|   76  |
|   54  |
|   34  |
|   22  |
|   8   |
|   2   |

但我想要这样:

|   356 |
|   87  |
|   76  |
|   54  |
|   34  |
|   22  |
|   8   |
|   2   |
|   -4  |
|   -45 |

这里是完整代码的要点:https://gist.github.com/avoxy/380e96a87cb3c6cc1f4a62c02fb6428d

谢谢大家

【问题讨论】:

  • 什么麻烦
  • 这应该是一种什么样的排序算法?
  • 为什么 -45 在您想要的输出中出现在堆栈的顶部,而不是底部?
  • 为什么sort() 返回一个void* 类型的值? ... 为什么函数内部没有return 语句?
  • 您的算法不会总是产生排序后的输出。检查逻辑

标签: c algorithm sorting


【解决方案1】:

您是按指针排序,而不是按指向的值。事实上,在这种情况下,您没有指向值,这就产生了为什么要使用指针的问题。无论如何,这是有问题的代码:

push((int*) -45, stack);

指针大多不是负数。因此,这种强制转换将导致下溢,并且取决于您的编译器,将导致一个大的正指针。因此,此指针将比您使用的任何其他指针都大(-4 除外)。

总结:不要按指针排序(除非你真的知道自己在做什么)。不要使用指针来表示纯整数。

【讨论】:

  • 在你的帮助之前我看到的另一个问题是在 head 函数中,我从 head 函数中删除了指针并且代码工作,谢谢。
  • 在这种情况下(假设为 32 位模式),转换为指针实际上与转换为无符号整数相同。所以负整数改成2^32-值,-45改成4294967251,-4改成4294967292,成为两个最大值。
【解决方案2】:

您的element 变量被声明为int * 类型。假设这是合适的,在您的排序中,您正在比较 指针,但您似乎想要比较它们指向 的值。

【讨论】:

    猜你喜欢
    • 2011-12-08
    • 2021-11-02
    • 2011-03-25
    • 2023-04-11
    • 1970-01-01
    • 2021-10-10
    • 2014-02-16
    • 2012-02-19
    相关资源
    最近更新 更多