【问题标题】:sorting stack in ascending order using recursion使用递归按升序对堆栈进行排序
【发布时间】:2023-04-11 06:16:01
【问题描述】:

我很想知道如何使用 recursion升序 顺序对堆栈进行排序 我已经使用递归按降序对堆栈进行了排序,但找不到升序的逻辑。 请告诉我一些逻辑。 提前致谢
编辑:

我的排序函数和插入函数的代码,用于对堆栈进行降序排序

void sort(stack<int>&st)
{
    if(st.size()==1)
        return;
    int ele=st.top();
    st.pop();
    sort(st);
    insert(st,ele);
    return;
}


void insert(stack<int>&st,int ele)
{
    int x=st.size(),y=st.top();
    if(x==0||y<=ele)
    {
        st.push(ele);
        return;
    }
    int t=st.top();
    st.pop();
    insert(st,ele);
    st.push(t);
    return;
}

【问题讨论】:

  • 降序的解决方案是什么?
  • @Manuel 请从下面给出的链接中查看我的排序功能和插入功能。我是 stackoverflow 的新手。结果我没有在评论部分给出我的代码。请从此链接查看:paste.ubuntu.com/p/6rZghhVpnv
  • 是的,不应该出现在评论中,应该出现在问题中。反正你不能把&lt;=改成&gt;=吗?
  • @manuel 如果我将 = ,它将终止而不在输出中显示任何内容。
  • 那么您的降序代码可能也不正确。

标签: sorting recursion stack


【解决方案1】:

首先编写insert,它接受一个排序堆栈s和一个要插入的值v。该函数将确保v按顺序插入并保持s的升序排序-

function insert(s, v)
{ if (s.length == 0) return push(s, v)
  const r = []
  while (s.length)
    if (peek(s) < v) break
    else move1(s, r)
  push(s, v)
  move(r, s)
}

如果我们从一个空堆栈开始,s = [],我们可以 insert 一次一个值来获得一个按升序排序的堆栈 -

const s = []
insert(s, 7)
insert(s, 2)
insert(s, 9)
insert(s, 4)
console.log(s)
[2,4,7,9]

我们的insert 函数依赖于我们需要编写的其他方便的堆栈操作。例如move1一个 项从q 移动到p -

function move1(q, p)
{ push(p, pop(q)) }

moveq全部 移动到p -

function move(q, p)
{ while (q.length) move1(q, p) }

现在,如果我们从未排序的堆栈s 开始对descending 进行排序,我们将创建一个新堆栈rinsert,每个popped 值都来自s。临时的r 将按升序排列,但目标是对s 进行排序!只需move 所有rs,现在s 是降序排列-

function descending(s)
{ const r = []
  while(s.length)
    insert(r, pop(s))
  move(r, s)
}

const q = [7,1,6,5,4,9,3]
descending(q)
console.log(q)
[1,3,4,5,6,7,9]

要对ascending 排序,我们首先按descending 排序,然后简单地按reverse 排序-

function ascending(s)
{ descending(s)
  reverse(s)
}

function reverse(s)
{ const q = [], p = []
  move(s, q)
  move(q, p)
  move(p, s)
}

const q = [7,1,6,5,4,9,3]
ascending(q)
console.log(JSON.stringify(q))
[9,7,6,5,4,3,1]

最终实现这些其他基本堆栈操作,poppushpeek -

function pop(s)
{ return s.pop() }

function push(s, v)
{ s.push(v) }

function peek(s)
{ const v = pop(s)
  push(s, v)
  return v
}

【讨论】:

  • 感谢兄弟描述这种好方法
猜你喜欢
  • 2011-12-08
  • 2021-11-02
  • 2019-05-05
  • 2014-03-20
  • 1970-01-01
  • 2014-09-06
  • 2018-11-08
  • 1970-01-01
  • 2015-01-14
相关资源
最近更新 更多