僅使用遞迴函式和棧操作逆序一個棧
阿新 • • 發佈:2018-11-20
題目
一個棧依次壓入1,2,3, 4, 5,那麼從棧頂到棧底分別為5, 4, 3, 2, 1。將這個棧轉置後,從棧頂到棧底為1,2,3, 4, 5,也就是實現棧中元素的逆序,但是隻能使用遞迴函式來實現,不能使用其他資料結構。
解題參考和一些坑
共兩個遞迴函式來實現逆序:
第一個函式需要將得到一個棧的棧底,並將棧底元素移除,同時還需要將除棧底外的元素按照原順序壓入棧中
第二個逆序函式需要將取得的元素按照得到的順序重新壓入棧中,得到逆序後的新棧;
這裡需要注意的一點是因為在C++中引數傳遞時需要傳引用,否則第二次遞迴時,使用的棧是未變化的棧,會導致錯誤結果!!!
#include<iostream> #include<stack> using namespace std; int getAndRemoveLastElement(stack<int> &s1) { int res = s1.top(); s1.pop(); if (s1.empty()) return res; else { int last = getAndRemoveLastElement(s1); s1.push(res); return last; } } void reverse(stack<int> &s) { if (s.empty()) return; int i = getAndRemoveLastElement(s); reverse(s); s.push(i); } int main() { stack<int> testStack; for (int i = 0; i < 3; i++) testStack.push(i); reverse(testStack); for (int i = 0; i < 3; i++) { cout << testStack.top() << endl; testStack.pop(); } getchar(); return 0; }