Push_swap:使用两个具有有限指令的可旋转堆栈,在 C 中按升序对给定的一组数字进行排序

2023-11-25

我被给予本校 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- 向上移动堆栈中的所有元素aby 1.第一个元素成为最后一个元素。
  • rb:旋转b- 向上移动堆栈中的所有元素bby 1.第一个元素成为最后一个元素。
  • rr: ra and rb同时。
  • rra: 反向旋转a- 向下移动堆栈的所有元素aby 1. 最后一个元素成为第一个元素。
  • rrb: 反向旋转b- 向下移动堆栈的所有元素bby 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:

  1. 将所有元素从 A 移动到 B,但保留 T 中最大的元素
  2. 将所有元素从 B 移动到 A
  3. 将T中的元素放入栈B中
  4. Loop until A is empty
    1. 将所有元素从 A 移动到 B,但保留 T 中最大的元素
    2. 将所有元素从 B 移动到 A,除了底部最大的元素(这里是计数器方便保存 B 中已排序元素数量的地方)
    3. 将T中的元素放入栈B中

当然,您可以(并且应该)将所有这些都放在一个循环中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Push_swap:使用两个具有有限指令的可旋转堆栈,在 C 中按升序对给定的一组数字进行排序 的相关文章

  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • 首先对列表中最长的项目进行排序

    我正在使用 lambda 来修改排序的行为 sorted list key lambda item item lower len item 对包含元素的列表进行排序A1 A2 A3 A B1 B2 B3 B 结果是A A1 A2 A3 B
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 当模板类不包含可用的成员函数时,如何在编译时验证模板参数?

    我有以下模板struct template
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 转到定义:“无法导航到插入符号下的符号。”

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我今天突然开始在我的项目中遇到一个问题 单击 转到定义 会出现一个奇怪的错误 无法导航到
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • 在服务器端 Blazor 中,如何取消页面或组件长时间运行的后台任务?

    假设我有一个长时间运行的任务 该任务已初始化并从派生自 Microsoft AspNetCore Components ComponentBase 的页面类的 OnInitializedAsync 方法启动 我用它来收集数据 它会不时更新
  • 在Python中设置时区

    Python 是否可以像 PHP 中那样设置时区 date default timezone set Europe London Year date y Month date m Day date d Hour date H Minute
  • 使用触发器更改插入的值

    我几周前才开始学习 SQL 我正在尝试制作一个触发器 如果 插入的值小于 10 则将其更改为 10 我现在搜索了 4h 找到了很多答案 但没有很好 对我来说 我实在不明白问题出在哪里 这是代码 CREATE OR REPLACE TRIGG
  • 在 C 中初始化以 NULL 结尾的字符串数组的正确方法

    这段代码正确吗 char argv foo bar NULL 它在语法上是正确的 并且它确实创建了一个以 NULL 结尾的字符串数组 argv 被传递给main as char 或同等地 char 但将字符串文字视为 更正确 const c
  • Android Studio 添加库通用图像加载器失败

    Android 通用图像加载器 https github com nostra13 Android Universal Image Loader 是我最喜欢的图书馆 但是当我使用Android Studio 使用0 1 5版本 时它无法添加
  • Django 目录结构?

    我想实现一个特定于项目的简单排队服务 代码应该放在 Django 目录结构中的哪个位置 目前的结构是 sound init py models py tests py views py static 编辑 我问将我在上面的目录结构中创建的队
  • myVar = !!someOtherVar [重复]

    这个问题在这里已经有答案了 我可以澄清为什么我想使用它吗 myVar someOtherVar 在非严格类型语言中 运算符将值转换为布尔值 做两次就相当于说 myVar boolean someOtherVar 请注意 为了代码清晰 不建议
  • 如何计算列表项的出现次数?

    给定一个项目 如何在 Python 中计算它在列表中的出现次数 A related but different problem is counting occurrences of each different element in a c
  • 错误:nodejs 中的 getaddrinfo ENOTFOUND 用于 get 调用

    我正在节点上运行一个 Web 服务器 其代码如下 var restify require restify var server restify createServer var quotes author Audrey Hepburn te
  • 在每个应用程序中的对象使用后为其分配“null”

    你总是分配null达到其范围后的对象 或者依赖 JVM 进行垃圾收集 您是否对所有类型的应用程序都执行此操作 无论其长度如何 如果是这样 这总是一个好的做法吗 除非有非常具体的原因 否则没有必要将对象显式标记为 null 此外 我从未见过一
  • 从 C# 客户端在 Solr 中索引 pdf 文档

    基本上我试图在 Solr 中索引 word 或 pdf 文档并找到 ExtractingRequestHandler 但无法弄清楚如何在 c 中编写执行 HTTP POST 请求的代码 如 Solr wiki 中所示 http wiki a
  • C 中最快的解交错操作?

    我有一个指向字节数组的指针mixed包含两个不同数组的交错字节array1 and array2 Say mixed看起来像这样 a1b2c3d4 我需要做的是对字节进行去交错 这样我就得到了array1 abcd and array2 1
  • Android 开发:Keytool,创建密钥库?

    我正在尝试为谷歌市场准备我的应用程序 但事实证明它比预期更具挑战性 我似乎无法掌握签署应用程序的整个概念 但更具体地说 我的问题是我已经安装了 Eclipse 的 keytool 插件 但是当我想创建一个证书时 它要求我选择一个密钥库 输入
  • 如何在 OpenCV 中裁剪 CvMat?

    我有一个图像转换为CvMat矩阵说CVMat source 一旦我得到一个感兴趣的区域source我希望算法的其余部分仅应用于该感兴趣的区域 为此 我想我将不得不以某种方式裁剪source我无法这样做的矩阵 有没有一种方法或函数可以裁剪Cv
  • C 中的参数传递 - 指针、地址、别名

    有人可以解释一下参数传递之间的区别吗C请 根据教授的笔记 有 4 种不同的方式来传递参数 按值调用 按地址调用 指针 按别名呼叫 全局变量 静态变量 如果您能举个例子 我将不胜感激 并且您的工作将受到赞扬 按值调用 将值作为参数传递给函数
  • jquery .stop() 不工作

    我正在尝试构建一个菜单 其中默认情况下仅显示第一个项目 当您将鼠标悬停在其上时 其余项目会滑出 并在鼠标离开时再次隐藏 它大部分工作正常 但如果鼠标在完成滑出之前退出 则不会调用隐藏函数 我想stop 本来应该解决这个问题 但似乎没有任何影
  • Python 中内置类型的自定义比较函数

    我正在使用 Python 的内置集合来保存我定义的类的对象 对于这个类 我定义了 eq ne and hash 这样我就可以通过自定义比较函数来比较对象 这很好用 直到我发现我确实需要two比较函数集 这些函数将在我的代码中的不同时间以不同
  • 如何在 jQuery.each 函数的每个循环之间设置延迟?

    我有这样的代码 li each function var data this text requestFunction data function status if status OK do stuff 所以 我需要在使用函数 reque
  • FPU 与软件仿真的性能比较

    虽然我知道 所以我被告知 浮点协处理器的工作速度比任何浮点算术的软件实现都快 但我完全不知道这种差异有多大 以数量级而言 答案可能取决于微处理器和超级计算机之间的应用程序以及您的工作地点 我对计算机模拟特别感兴趣 你能指出这个问题的文章或论
  • Push_swap:使用两个具有有限指令的可旋转堆栈,在 C 中按升序对给定的一组数字进行排序

    我被给予本校 42 项任务 您可以使用一组 int 值 2 个堆栈和一组操作这两个堆栈的指令 用C编写 一个程序 称为push swap它计算并在标准输出上显示最小的程序Push swap对收到的整数参数进行排序的指令语言 sa swap