stackの中の要素を再帰的に反転する
Reverse a stack using recursion
問題はstackの中の要素を反転することを説明して、while,forのこのような循環機構を使うことができなくて、stackのいくつかの操作だけを使うことを許可して、例えば:empty(S)push(S)pop(S)
solution:この問題を解決するには2つの再帰関数を使用する必要があります.最初の再帰関数は、stackが空になるまで、stack内の各要素をパスから下に移動します.
S1 –>
S2–>
S3–>
S4–>
S5–>
1 2 345
12345
12345
12345
12345
2番目の再帰関数は、stackの最後の要素から順に、各要素をstackの下部に挿入します.
S10
54321
15432
12543
12354
12345
コードは次のとおりです.
完全なコード:
問題はstackの中の要素を反転することを説明して、while,forのこのような循環機構を使うことができなくて、stackのいくつかの操作だけを使うことを許可して、例えば:empty(S)push(S)pop(S)
solution:この問題を解決するには2つの再帰関数を使用する必要があります.最初の再帰関数は、stackが空になるまで、stack内の各要素をパスから下に移動します.
S1 –>
S2–>
S3–>
S4–>
S5–>
1 2 345
12345
12345
12345
12345
2番目の再帰関数は、stackの最後の要素から順に、各要素をstackの下部に挿入します.
S10
54321
15432
12543
12354
12345
コードは次のとおりです.
void insertBottom(Stack &stk, int val)
{
if(stk.empty())
{
stk.push(val);
return;
}else{
int temp = stk.top();
stk.pop();
insertBottom(stk, val);
stk.push(temp);
return;
}
}
void reverse(Stack &stk)
{
if(!stk.empty())
{
int temp = stk.top();
stk.pop();
reverse(stk);
insertBottom(stk, temp);
}
return;
}
完全なコード:
#include
using namespace std;
class Stack{
public:
Stack(int n){
num = n;
arr = new int[n]();
t = -1;
}
~Stack(){
delete [] arr;
}
bool empty()
{ return t<0; }
void push(int val)
{
t++;
if(t >= num)
{ cout<<"the stack is full"<return;
}else
arr[t] = val;
return;
}
void pop()
{
if( t<0 )
{ cout<<"the stack is empty, can't pop'"<return;
}else
t--;
}
int top()
{
if(t<0)
{ cout<<"the stack is empty";
return -1;
}else
return arr[t];
}
public:
int *arr;
private:
int num;
int t;
};
void print(Stack &stk)
{
if(!stk.empty())
{
int temp = stk.top();
cout<else{
cout<return;
}
void insertBottom(Stack &stk, int val)
{
if(stk.empty())
{
stk.push(val);
return;
}else{
int temp = stk.top();
stk.pop();
insertBottom(stk, val);
stk.push(temp);
return;
}
}
void reverse(Stack &stk)
{
if(!stk.empty())
{
int temp = stk.top();
stk.pop();
reverse(stk);
insertBottom(stk, temp);
}
return;
}
int main()
{
int arr[] = {
6,5,4,3,2,1};
Stack stk(10);
for(int i = 0; i<6; ++i)
stk.push(arr[i]);
print(stk);
reverse(stk);
print(stk);
}