請編寫一個程序,按升序?qū)_M(jìn)行排序(即最大元素位于棧頂)实夹,要求最多只能使用一個額外的棧存放臨時數(shù)據(jù)劈榨,但不得將元素復(fù)制到別的數(shù)據(jù)結(jié)構(gòu)中访递。
除了原棧外,需要借助一個棧help同辣。用某種規(guī)則使得原棧的元素進(jìn)入help棧拷姿,且help棧是排好序的而且棧頂最小,這樣從help中搬運(yùn)元素回原棧時旱函,原棧才是排好序的响巢,且棧頂最大。
整個過程中棒妨,想象兩個棧是兩支試管口對口橫著放:
每次取出棧頂元素t踪古,
情況1: 若help為空或t小于help棧頂,則壓入help中
情況2:若help不為空且t大于help棧頂,則從help中彈出元素壓入原棧內(nèi)伏穆,直至到達(dá)情況1為止拘泞。然后將t壓入help中。
情況1比較容易理解枕扫,要想棧排序使得棧頂最小陪腌,那么新元素小于棧頂,就可以直接壓棧烟瞧。
情況2中诗鸭,為了達(dá)到1的情況,所以從help中彈出元素参滴,直到發(fā)生情況1為止强岸。整個過程有點(diǎn)像插入排序,更形象來說卵洗,像是算盤撥珠子的過程请唱。
因?yàn)樵夭荒苋拥簦詇elp彈出來的都壓入了原棧內(nèi)过蹂。這些元素不必刻意處理十绑,在后續(xù)過程會回到合適位置的。
處理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){ //因?yàn)槎搪非笾档奶匦钥嵘祝粫伋霎惓? int uu=help.top();
help.pop();
s.push(uu);
}
help.push(t);
}
s=help;
}