前言---
明天週末了,打算用來整理一下數據庫,Cisco命令和Linux,這篇博客寫完之後就打算滾回宿舍休息了,路上順便買下水果,補充補充維C。
前言補充----
突然被管教學樓的老師給清出教室了,由於教室明後天要當某證書的考場,這種做事被打擾的感覺實在是難受。不過順便反映了我常待的教室被兩個考研女生強行霸佔,關門不讓進的自私做法。。。。
哎,宿舍是睡覺和玩的地方,立馬跑到圖書館,又遇見圖書館改造而暫時關閉,之後跑到考研自習室,看到了很多熟悉的面孔,聽說還有100多天,可能都很緊張吧,樓道都是背誦的人,看到大家這麼努力,自己卻還是這麼菜,有點難過,嗚嗚嗚。。
手機,電腦都快沒電了,不過好在博客寫好了,回去喫水果了。。。
用一個棧來對另一個棧進行排序
題目:
一個棧中的元素爲整型,現在想將該棧從頂到底按從小到大的順序排序,只許申請一個棧。除此之外,可以申請新的變量,但不能
申請額外的數據結構。如何完成排序?
分析:
其實這道題很簡單,用紙張稍微畫一下就知道怎麼做了。 首先我們定義要進行排序的那個棧爲stackMain, 進行輔助排序的那 個棧爲stackAux(auxiliary)。
由於我們要使排序好的數存儲在stackMain中,而不是在stackAux中,所以一開始我們需要將stackMain中的元素全部倒入到stackAux()。
例如一開始
stackMain() stackAux stackMain() stackAux
7 10
2 5
3 8
8 3
5 2
10 7
接下來,我們首先從stackAux中Pop一個數(要先判斷棧是否爲空),設這個數爲cur, 然後判斷這個數與stackMain棧頂的數的大小關係:
如果cur < stackMain棧頂的元素,則 將stackMain棧頂的元素先彈出,然後壓入stackAux中,就這樣不斷判斷,直到cur >=stackMain棧頂的元素,之後再把cur壓入stackMain
如果cur >= stackMain棧頂的元素,那麼就直接把cur 壓入stackMain就可以了。
簡單流程如下:
假設 stackMain stackAux
5
4 8
stackMain stackAux
8 5
4
stackMain stackAux
4
5
8
附完整Java代碼:
package code_180;
import java.util.*;
public class StackSort {
private Stack<Integer>stackMain;
private Stack<Integer>stackAux;
StackSort(){
stackMain = new Stack<Integer>();
stackAux = new Stack<Integer>();
}
public void sort() {
while(!stackMain.empty()) {
stackAux.push( stackMain.pop());
}
while(!stackAux.empty()) {
int value = stackAux.pop();
if(stackMain.empty())
stackMain.push(value);
else {
while( !stackMain.empty() && stackMain.peek() > value ) { // pop或者peek一個數之前一定要判斷棧是否爲空,否則會越界或者死循環
stackAux.push(stackMain.pop());
}
stackMain.push(value);
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
StackSort myStack = new StackSort();
Scanner cin = new Scanner(System.in);
for(int i = 0 ; i < 6 ;i ++) {
myStack.stackMain.push( cin.nextInt() ) ;
}
myStack.sort();
while(!myStack.stackMain.empty()) {
System.out.println(myStack.stackMain.pop());
}
}
}
//7 2 3 8 5 10
後面看了一下題解,書上的做法和我的做法大同小異。書本上是先把stackMain中的元素在stackAux中進行頂部到底部的自小到大排序,然後把stackAux中的元素倒入到stackMain中,這樣的做法和我的其實原理是一樣的。讀者可以自行選擇。(Ps:左神書上的這個地方,有點小錯誤,就是符號寫錯了)