前言---
明天周末了,打算用来整理一下数据库,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:左神书上的这个地方,有点小错误,就是符号写错了)