我被给予本校 42 项任务:
您可以使用一组 int 值、2 个堆栈和一组操作这两个堆栈的指令。
用C编写[一个程序]:
[...] 称为push_swap
它计算并在标准输出上显示最小的程序Push_swap
对收到的整数参数进行排序的指令语言:[...]
-
sa
: swap a
- 交换栈顶的前2个元素a
。如果只有一个元素或没有元素,则不执行任何操作)。
-
sb
: swap b
- 交换栈顶的前2个元素b
。如果只有一个元素或没有元素,则不执行任何操作)。
-
ss
: sa
and sb
同时。
-
pa
: push a
- 取顶部的第一个元素b
并将其放在顶部a
。如果出现以下情况,则不执行任何操作b
是空的。
-
pb
: push b
- 取顶部的第一个元素a
并将其放在顶部b
。如果出现以下情况,则不执行任何操作a
是空的。
-
ra
:旋转a
- 向上移动堆栈中的所有元素a
by 1.第一个元素成为最后一个元素。
-
rb
:旋转b
- 向上移动堆栈中的所有元素b
by 1.第一个元素成为最后一个元素。
-
rr
: ra
and rb
同时。
-
rra
: 反向旋转a
- 向下移动堆栈的所有元素a
by 1. 最后一个元素成为第一个元素。
-
rrb
: 反向旋转b
- 向下移动堆栈的所有元素b
by 1. 最后一个元素成为第一个元素。
-
rrr
: rra
and rrb
同时。
所以我必须将数字放入堆栈中a
然后使用这两个堆栈按升序对它们进行排序a
and b
.
我的排序功能
void sorts_stack(stack *a, stack *b)
{
int srt;
srt = is_not_sorted(a);
if (srt)
{
if (a->list[srt] == top(a) && a->list[srt] > a->list[0])
{
rotate_ra_rb(a->list, a->size); //ra : rotate a
putstr("ra\n");
}
else if (a->list[srt] == top(a) && a->list[srt] > a->list[srt - 1])
{
swap_sa_sb(a->list, a->size);//sa : swap a
putstr("sa\n");
}
else if (a->list[srt] > a->list[srt - 1])
{
putstr("pb\n"); //pb : push b
push_pb(a, b);
}
sorts_stack(a, b);
}
else if (b->size > 0)
{
if (top(a) < top(b))
{
push_pa(a, b); //pa : push a
putstr("pa\n");
}
else if ((top(a) > top(b)) && b->size != 0)
{
push_pa(a, b); //pa : push a
putstr("pa\n");
}
sorts_stack(a, b);
}
}
我的函数对堆栈进行排序,但排序需要太多步骤。我需要有关如何以更少的步骤对堆栈进行排序的建议或建议。
完整的在线代码--损坏的链接
给定两个堆栈 A 和 B,其中 A 填充有元素的随机排列,B 为空,并且一个临时变量 T 能够保存一个元素(以及一个计数器,但计数器不计数),您可以按升序对 A 进行排序通过以下方式订购到 B:
- 将所有元素从 A 移动到 B,但保留 T 中最大的元素
- 将所有元素从 B 移动到 A
- 将T中的元素放入栈B中
- Loop until A is empty
- 将所有元素从 A 移动到 B,但保留 T 中最大的元素
- 将所有元素从 B 移动到 A,除了底部最大的元素(这里是计数器方便保存 B 中已排序元素数量的地方)
- 将T中的元素放入栈B中
当然,您可以(并且应该)将所有这些都放在一个循环中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)