請編寫一個程序,按升序對棧進行排序(即最大元素位于棧頂),要求最多只能使用一個額外的棧存放臨時數據,但不得將元素復制到別的數據結構中。
除了原棧外,需要借助一個棧help。用某種規則使得原棧的元素進入help棧,且help棧是排好序的而且棧頂最小,這樣從help中搬運元素回原棧時,原棧才是排好序的,且棧頂最大。
整個過程中,想象兩個棧是兩支試管口對口橫著放:
每次取出棧頂元素t,
情況1: 若help為空或t小于help棧頂,則壓入help中
情況2:若help不為空且t大于help棧頂,則從help中彈出元素壓入原棧內,直至到達情況1為止。然后將t壓入help中。
情況1比較容易理解,要想棧排序使得棧頂最小,那么新元素小于棧頂,就可以直接壓棧。
情況2中,為了達到1的情況,所以從help中彈出元素,直到發生情況1為止。整個過程有點像插入排序,更形象來說,像是算盤撥珠子的過程。
因為元素不能扔掉,所以help彈出來的都壓入了原棧內。這些元素不必刻意處理,在后續過程會回到合適位置的。
處理4
處理3
處理5
CODE
void StackSort(stack<int> &s){
stack<int> help;
while(!s.empty()){
int t=s.top();
s.pop();
while(!help.empty() && help.top()>t){ //因為短路求值的特性,不會拋出異常
int uu=help.top();
help.pop();
s.push(uu);
}
help.push(t);
}
s=help;
}