利用兩個棧,反轉其中乙個棧的元素

2022-05-01 03:00:09 字數 1224 閱讀 3130

有兩個相同的棧,乙個裡面放著自大到小排列的數,棧頂的數最小,另乙個棧是空的。不允許利用其它的資料結構,只能利用這兩個棧,要求把第乙個棧裡的數字反過來,從小到大排列,結果還放在原來的那個棧裡面。

思路:假設stacka存放數,stackb為輔助棧。stacka元素個數為n。

第1次操作:先取stacka棧頂元素,記為tmp,然後把剩餘n-1個元素轉移到stackb中,接著把tmp和stackb的n-1個元素依次壓入stacka中,這樣完成了stacka原棧頂的反轉。

第2次操作:先取stacka棧頂元素,記為tmp,因為棧底有乙個元素已完成反轉,故只需要把剩餘的n-2個元素轉移到stackb,接著把tmp和stackb的n-2個元素依次壓入stacka中,這樣完成了stacka原棧頂第二個元素的反轉。

第i次操作:先取stacka棧頂元素,記為tmp,之前已有i-1個元素完成反轉,只需要把棧頂的n-i+1個元素轉移到stackb,接著把tmp和stackb的n-i+1依次壓入stacka中。

注意:第n次操作時,因為前面n-1次操作已完成,而此時的棧頂就是初始的棧底,故第n次操作不需要做。總的過程只需要n-1次操作。 

實現:

1

void reversestack(stack&a, stack&b)28

//共需要nlen-1次操作

9for (int i = 0; i < nlen - 1; ++i)

1020

//依次壓入tmp和stackb元素

21a.push(tmp);

22while (!b.empty())

2328

}29 }

測試函式:

因為棧是先進後出的,而把棧中元素反過來後,再輸出資料就會和壓入的順序一致了。

棧 兩個棧實現乙個佇列

auther 巨未 date 2019 1 5 0005 18 29 description 順序棧 class mystackk public mystackk int size 入棧 public void push int val this.elem this.top val 放乙個值,top...

兩個棧模擬乙個佇列 兩個佇列模擬乙個棧

解題思路 插入操作在stack1中進行,刪除操作在stack2中進行,如果stack2為空,則將stack1中的所有元素轉移到stack2中。include include includeusing namespace std template class cqueue 建構函式 template ...

兩個棧實現乙個佇列 兩個佇列實現乙個棧

這兩個題的思路比較相似。棧的特點是 先進後出 佇列的特點是 先進先出 不要怕!用兩個棧實現乙個佇列很簡單 再將top元素push到stack 2中,然後將stack 1 pop一次直到stack 1剩下最後乙個元素,這個就是最先push進去的,我們把它pop掉就可以了,同理,我們求queue的fro...