Почему переменная Char хранит прошлое значение стека без объявления массива char?Видишь код? - PullRequest
0 голосов
/ 26 ноября 2018

Я готовлюсь к интервью.Я практиковал пару вопросов на собеседовании каждый день.но иногда, когда что-то не доходит до меня, я использую Интернет в качестве ссылки.

Теперь здесь, в этом случае вопрос, который говорит:

Q Напишите программу для удаления среднего элемента стека безиспользуя структуру данных?Теперь я застрял на 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); 
} 
} 

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

ваша программа использует рекурсивный вызов deleteMid ().Я предлагаю вам прочитать рекурсивную концепцию дерева.Лучший способ понять рекурсивный метод - это попробовать программу Фибоначчи и нарисовать рекурсивное дерево.

вам необходимо понять значение хранилища, связанное с каждым рекурсивным вызовом.

char x = st.pop(); 

X имеет разные значения для каждого рекурсивного вызова, и когда вы достигаете условия завершения

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

, рекурсивный вызов возвращается и выполняет операторы

if (curr != n/2) 
     st.push(x); 
 }
0 голосов
/ 26 ноября 2018

Здесь:

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

У вас есть рекурсивный метод, который использует локальную переменную.Когда вы рекурсивно вызываете тот же метод снова, создается еще один стек методов.Место для другого x назначено.

Это основная концепция любого языка программирования: когда вы вызываете функцию / метод, вы резервируете некоторое количествопамяти для этого конкретного вызова.Это формирует стек вызовов btw.

Итак, другими словами: рекурсивно вызывая этот метод, вы можете создать временное хранилище: каждый вызов метода будет помнить его значение x.Таким образом, каждый вызов deleteMid() имеет свой отдельный независимый символ x.Поэтому «сохраненное» значение все еще находится в x, когда рекурсивный вызов возвращается.

...