前言--
博主本打算把2,3題合併在一同一篇博文,但是第二題的題解寫的有點長,如果合併在一起反而不利於閱讀,so,另外寫一篇文章來記錄了(PS:我現在困得用音樂來提神了,回宿舍還有計算機組成,嵌入式應用的報告要寫,還要口語的打卡,然後洗澡,洗衣服,想想就累 啊!!!,不過還是得好好堅持!)
如何僅用遞歸函數和棧操作逆序一個棧
題目:一個棧依次壓入1.2.3.4.5,那麼從棧頂的到棧底的元素就分別是5.4.3.2.1,如何通過遞歸函數把這個棧的元素逆序,使棧
頂到棧底的元素依次是1.2.3.4.5.
分析:這題我想了半小時,沒想出來,然後看了下題解,感覺真的太妙了,一個getAndRemoveLast()的遞歸函數,作用是用來去除棧底的元素並返回棧底的元素。這個方法我真的想不出來,實在是太妙了,ORZ,不過這個姿勢我記下了,以後多用使之轉變爲自己的。
附getAndRemoveLast()代碼:
public int getAndRemoveLast( Stack<Integer> stack ) {
int value = stack.pop();
int result;
if(stack.empty()) {
return value;
}
else {
result = getAndRemoveLast(stack);
stack.push(value);
return result;
}
}
由於遞歸的理解完全取決於個人,我只能按我自己的理解給大家解釋一下,首先這個函數的作用就是對於當前的棧,我把棧頂的
元素給pop了,如果pop完之後棧爲空了,說明當前pop出去的元素就是棧底的元素了,那麼就可以return 了。
如果pop完之後,剩餘的棧還不爲空,那麼我們還需要對剩餘的棧進行getAndRemoveLast。當返回該層次調用的時候,說明已經把剩餘的棧的棧底元素給去除了並且返回了它的值,那麼我此時應該把在這個層次Pop出去的數,給Push回去。
這樣當我們返回第一層調用時,就已經把棧底的元素給去除了,而其他元素不變,是不是很妙!!!!!!
除了getAndRemoveLast()這個遞歸函數之外,我們還要設計一個Rverse()函數。
我在理解了第一個遞歸函數後,不用看書就能自己實現出第二個遞歸函數Reverse(),寫完之後跟書對照了之後,發現都一樣的,看來getAndRemoveLast()這個遞歸函數的設計纔是難點!
附Reverse的代碼:
public void Reverse(Stack<Integer>stack) {
int value = this.getAndRemoveLast(stack);
if(stack.empty()){
stack.push(value);
return;
}
else {
this.Reverse(stack);
stack.push(value);
}
}
分析Reverse():
其實很簡單,我們要怎麼對一個棧完成逆序呢?
首先,把這個棧的棧底元素去除並且先保留它的值,然後對剩餘的棧實現Reverse(), 剩餘部分Reverse()完成,意味着剩餘的部分已經翻轉,然後我們再push原先保留的棧底的元素,這樣是不是就成功翻轉了呢! 我這句話實際上就是描述了Reverse()的函數該如何設計,由於遞歸函數的理解完全取決於個人,請讀者自行好好理解,必定大於好處!
Ps:滾回宿舍繼續幹活了~~~~~,順便附上JAVA完整代碼:
package code_180;
import java.util.*;
import java.util.Stack;
public class ReverseStack {
private Stack<Integer> stack;
ReverseStack(){
this.stack = new Stack<Integer>();
}
public int getAndRemoveLast( Stack<Integer> stack ) {
int value = stack.pop();
int result;
if(stack.empty()) {
return value;
}
else {
result = getAndRemoveLast(stack);
stack.push(value);
return result;
}
}
public void Reverse(Stack<Integer>stack) {
int value = this.getAndRemoveLast(stack);
if(stack.empty()){
stack.push(value);
return;
}
else {
this.Reverse(stack);
stack.push(value);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arrayTest = {1,2,3,4,5};
ReverseStack myStack = new ReverseStack();
for(int i = 0 ;i < 5 ;i++)
myStack.stack.push(arrayTest[i]);
myStack.Reverse(myStack.stack);
while( !myStack.stack.empty()) {
System.out.println(myStack.stack.peek());
myStack.stack.pop();
}
}
}