【问题标题】:Why Char variable is storing past value of stack without the declaration of char array? See code?为什么 Char 变量在没有声明 char 数组的情况下存储堆栈的过去值?看代码?
【发布时间】:2019-04-27 19:59:45
【问题描述】:

我正在准备面试。我曾经每天练习几个面试题。但有时当事情没有引起我的注意时,我会使用互联网作为参考。

现在在这个问题的情况下,

Q 写一个程序来删除堆栈的中间元素而不使用数据结构? 现在我停留在第 38 行,上面写着

char x = st.pop();  

这里 char 是如何存储过去的值的,因为没有提到 array 这怎么可能。?

//Java code to delete middle of a stack 
package my.project;
import java.io.*; 
import java.util.*; 
public class GFG { 
public static void main(String args[])  
 { 
     Stack<Character> st = 
               new Stack<Character>(); 

     st.push('1'); 
     st.push('2'); 
     st.push('3'); 
     st.push('4'); 
     st.push('5'); 
     st.push('6'); 
     st.push('7'); 

     deleteMid(st, st.size(), 0); 

     while (!st.empty()) 
     { 
         char p=st.pop(); 
         System.out.print(p + " "); 
     } 
 } 

 static void deleteMid(Stack<Character> st,int n, int curr) 
 { 
   if (st.empty() || curr == n) 
     return; 
   char x = st.pop(); 
   deleteMid(st, n, curr+1);   
   if (curr != n/2) 
     st.push(x); 
} 
} 

【问题讨论】:

  • 感谢您的快速回归!

标签: java arrays data-structures char stack


【解决方案1】:

这里:

static void deleteMid(Stack<Character> st,int n, int curr) 
{ 
...
char x = st.pop(); 

您有一个使用局部变量的递归方法。当您再次递归调用相同的方法时,会创建另一个方法堆栈。 另一个 x 的空间已分配。

这是任何编程语言的基本概念:当您调用一个函数/方法时,您为该特定调用保留一些内存。这样做形成call stack btw。

因此,换句话说:通过递归调用此方法,您可以创建一个“临时”存储:每个方法调用都会记住x值。因此,对deleteMid() 的每次调用都有其独立的独立字符x。因此,当递归调用返回时,“存储”值仍在x 中。

【讨论】:

    【解决方案2】:

    您的程序使用递归调用“deleteMid()”。 我建议你阅读递归树的概念。理解递归方法的最好方法是尝试使用斐波那契程序并绘制递归树。

    您需要了解与每个递归调用关联的存储值。

    char x = st.pop(); 
    

    X 对于每个递归调用以及当你达到终止条件时都有不同的值

    if (st.empty() || curr == n) 
         return; 
    

    递归调用回溯并执行语句

    if (curr != n/2) 
         st.push(x); 
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2020-03-09
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2014-12-11
      相关资源
      最近更新 更多