在堆栈末尾插入

时间:2017-07-16 15:47:25

标签: java recursion return

static void insert_at_bottom(char x){

    if(st.isEmpty())
        st.push(x);

    else{
        /* All items are held in Function Call Stack until we
           reach end of the stack. When the stack becomes
           empty, the st.size() becomes 0, the
           above if part is executed and the item is inserted
           at the bottom */

        char a = st.peek();
        st.pop();
        insert_at_bottom(x);

        //push all the items held in Function Call Stack
        //once the item is inserted at the bottom
        st.push(a);
    }
}

在上面的代码中,我对此步骤有疑问:

if(st.isEmpty())
        st.push(x);

我们不需要st.push(x)之后的退货声明吗?

我的意思是在递归堆栈中,当满足该条件时,即当堆栈为空时,它会将x推入堆栈,但是如果没有return语句,它将如何返回到先前的调用?

10 个答案:

答案 0 :(得分:1)

insert_at_bottom是一个无效函数。这种类型的函数不需要return语句。所以,一旦执行:

if(st.isEmpty())
  st.push(x);

它没有任何东西可以返回,没有任何其他东西可以执行并停止其递归。为了说明,执行顺序将是这样的。

char a = st.peek();
st.pop();
char a2 = st.peek();
st.pop();
char a3 = st.peek();
st.pop();
st.push(x);
st.push(a3);
st.push(a2);
st.push(a);

答案 1 :(得分:1)

if(st.isEmpty()){
  st.push(x);
  return;
}

我认为我们应该在添加元素后添加一个 return ,因为只写 return 意味着将光标控制回调用函数而不执行后续代码。并且由于递归,我们还需要一个基本情况

答案 2 :(得分:0)

不,您不一定需要return语句,因为if块之后没有语句

if(st.isEmpty()) st.push(x);

被执行。

无论我们是否编写return语句,代码都将执行相同的操作。

答案 3 :(得分:0)

不需要 return 有两个原因。

  1. 因为函数是 void 类型,所以我们不需要返回任何东西。

  2. 如果您认为在 if(st.isEmpty()) st.push(x); 剩余部分代码将执行之后,还有其他部分将不会执行,因此递归堆栈将自动返回到前一个调用;

答案 4 :(得分:0)

正如我们所知,这里我们不需要任何 return 语句,递归调用返回到它被调用的地方...... char a = st.peek(); st.pop(); insert_at_bottom(x); st.push(a);

在这种情况下,insert _at_ bottom(x) 将调用自身并返回,直到达到其基本情况。

答案 5 :(得分:0)

如果您使用的是 C/C++/java,则可以添加一个基本上不返回任何内容的 return 语句(因为函数 insert_at_bottom 的原型或返回类型为 void),例如:

if(st.isEmpty())
{
  st.push(x);
  return;
}

但是,我必须指出,由于您使用的是 if...else 语句,即使您不使用 return 语句,控制流本身也会从当前函数调用堆栈返回,因为在执行之后if 或 else 语句,控制将到达函数的末尾。

答案 6 :(得分:0)

def pushBottom(stack,x):
    if len(stack)==0:
        stack.append(x)
    else:
        temp=stack.pop()
        pushBottom(stack,x)
        stack.append(temp)

答案 7 :(得分:0)

使用递归堆栈的C++代码...

#include <bits/stdc++.h>
using namespace std;

void insert_at_bottom(stack<int> &s,int x)
{
    if(s.size()==0)
    {
        s.push(x);
        return;
    }
    
    int tmp=s.top();
    s.pop();
    insert_at_bottom(s,x);
    s.push(tmp);
}

int main() 
{
    int n,x;
    cin>>n>>x;
    stack<int> s;
    while(n--)
    {
        int a;
        cin>>a;
        s.push(a);
    }
    
    insert_at_bottom(s,x);
    
    while(!s.empty())
    {
        cout<<s.top()<<"\n";
        s.pop();
    }
}

答案 8 :(得分:0)

您必须在基本情况下添加了 return 语句。 但在这里..

由于所有其他代码都在 else 语句中,基本情况将跳过所有这些并无论如何到达代码的末尾,迫使它自动返回。

答案 9 :(得分:0)

时间复杂度为 O(n),因为每次插入需要移除 n 个元素。 空间复杂度为 O(n),因为需要 n 个递归堆栈调用。