java - 为什么 Char 变量在没有声明 char 数组的情况下存储堆栈的过去值?看到代码了吗?

标签 java arrays data-structures char stack

我正在准备面试。我曾经每天练习几个面试问题。但有时当我无法理解时,我会使用互联网作为引用。

现在,在这个问题中,

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

char x = st.pop();  

这里 char 如何存储过去的值,因为它没有提到数组这是如何可能的。?

//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); 
} 
} 

最佳答案

这里:

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

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

这是任何编程语言的基本概念:当您调用函数/方法时,您将为该特定调用保留一定量的内存。这样做就形成了 call stack顺便说一句。

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

关于java - 为什么 Char 变量在没有声明 char 数组的情况下存储堆栈的过去值?看到代码了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53476623/

相关文章:

java - 求和科学小数的错误

C:超出队列和内存限制

java - 找到随机国家,但选择人口较多国家的概率应该更高

java jbutton文本不适合不同的环境

java - Jackson:仅从接口(interface)导出 setter/getter

javascript - Zapier 返回带有空字段的对象数组 - 需要添加空字符串

javascript - 如何在reactjs中制作一个页面,该页面将保留在带有动态问题和选择的页面上?

c++ - 每个节点有两条边的有向图的实现 - 递归搜索功能

java - Lucene 返回空正则表达式搜索结果

javascript - 从对象数组和另一个简单数组创建简单数组