1. 程式人生 > >僅使用遞迴函式和棧操作逆序一個棧

僅使用遞迴函式和棧操作逆序一個棧

題目

一個棧依次壓入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;
}