用一个栈来对另一个栈进行排序 ——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:左神书上的这个地方,有点小错误,就是符号写错了)

  

猜你喜欢

转载自blog.csdn.net/CCSGTC/article/details/82708354
今日推荐