用一個棧來對另一個棧進行排序 ——Java從0開始學習系列之路(6)

前言---

明天週末了,打算用來整理一下數據庫,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:左神書上的這個地方,有點小錯誤,就是符號寫錯了)

 

  

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章