首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Char变量存储堆栈的过去值而没有char数组的声明?看到密码了吗?

为什么Char变量存储堆栈的过去值而没有char数组的声明?看到密码了吗?
EN

Stack Overflow用户
提问于 2018-11-26 07:44:33
回答 2查看 46关注 0票数 1

我正在为面试做准备。我以前每天都练习几个面试问题。但有时,当事情没有得到我,我使用互联网作为参考。

现在在这个问题上说,

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

代码语言:javascript
复制
char x = st.pop();  

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

代码语言:javascript
复制
//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); 
} 
} 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-26 07:47:09

在此:

代码语言:javascript
复制
static void deleteMid(Stack<Character> st,int n, int curr) 
{ 
...
char x = st.pop(); 

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2018-11-26 09:06:38

您的程序使用递归调用'deleteMid()‘。我建议您阅读递归树概念。理解递归方法的最好方法是使用Fibonacci程序并绘制递归树。

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

代码语言:javascript
复制
char x = st.pop(); 

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

代码语言:javascript
复制
if (st.empty() || curr == n) 
     return; 

递归调用遍历回并执行语句

代码语言:javascript
复制
if (curr != n/2) 
     st.push(x); 
 }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53476623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档