1_3仅用递归函数和栈操作逆序一个栈
2016-12-26 11:35
267 查看
1. 题目:仅用递归和栈提供的操作来实现对栈的逆序
2. 思路:除了书中列出的方法,我在想可不可以直接把一个栈中的元素一次弹出放入另一个辅助栈中,实现对栈的逆序(缺点是,需要辅助栈空间)。所以,用C++实现了书中的方法,并且实现了一下我自己的想法 (包含在#if 0 ...#endif之间的代码)。
3. Answer:
#include<stack>
using namespace std;
#if 0
template<typename T>
void reverseCore(stack<T> &stack1, stack<T> &stack2)
{
if (stack1.size()==0)
{
return;
}
else
{
T&top = stack1.top();
stack1.pop();
stack2.push(top);
reverseCore(stack1, stack2);
}
}
template<typename T>
void reverse(stack<T> &stack1)
{
stack<T> stack2;
if (stack1.size() == 0)
{
return;
}
else
{
reverseCore(stack1, stack2);
stack1 = stack2;
}
}
#endif
template<typename T>
T& getAndRemoveLastElement(stack<T> &stack)
{
T result = stack.top();
stack.pop();
if (stack.size() == 0)
{
return result;
}
else
{
int last = getAndRemoveLastElement(stack);
stack.push(result);
return last;
}
}
template<typename T>
void reverse(stack<T> &stack)
{
if (stack.size() == 0)
{
return;
}
else
{
int i = getAndRemoveLastElement<T>(stack);
reverse(stack);
stack.push(i);
}
}
int main()
{
stack<int> stack1;
for (int i = 0; i < 5;i++)
{
stack1.push(i);
}
printf("stack1 top: %d\n", stack1.top());
reverse<int>(stack1);
printf("stack2 top: %d", stack1.top());
system("pause");
return 1;
}
2. 思路:除了书中列出的方法,我在想可不可以直接把一个栈中的元素一次弹出放入另一个辅助栈中,实现对栈的逆序(缺点是,需要辅助栈空间)。所以,用C++实现了书中的方法,并且实现了一下我自己的想法 (包含在#if 0 ...#endif之间的代码)。
3. Answer:
#include<stack>
using namespace std;
#if 0
template<typename T>
void reverseCore(stack<T> &stack1, stack<T> &stack2)
{
if (stack1.size()==0)
{
return;
}
else
{
T&top = stack1.top();
stack1.pop();
stack2.push(top);
reverseCore(stack1, stack2);
}
}
template<typename T>
void reverse(stack<T> &stack1)
{
stack<T> stack2;
if (stack1.size() == 0)
{
return;
}
else
{
reverseCore(stack1, stack2);
stack1 = stack2;
}
}
#endif
template<typename T>
T& getAndRemoveLastElement(stack<T> &stack)
{
T result = stack.top();
stack.pop();
if (stack.size() == 0)
{
return result;
}
else
{
int last = getAndRemoveLastElement(stack);
stack.push(result);
return last;
}
}
template<typename T>
void reverse(stack<T> &stack)
{
if (stack.size() == 0)
{
return;
}
else
{
int i = getAndRemoveLastElement<T>(stack);
reverse(stack);
stack.push(i);
}
}
int main()
{
stack<int> stack1;
for (int i = 0; i < 5;i++)
{
stack1.push(i);
}
printf("stack1 top: %d\n", stack1.top());
reverse<int>(stack1);
printf("stack2 top: %d", stack1.top());
system("pause");
return 1;
}
相关文章推荐
- 3.如何仅用递归函数和栈操作逆序一个栈
- 如何使用递归函数和栈操作逆序一个栈
- 003如何仅使用递归函数和栈操作逆序一个栈
- 栈和队列 如何仅用递归函数和栈操作逆序一个栈
- 栈和队列——如何仅用递归函数和栈操作逆序一个栈
- 如何仅用递归函数和栈操作逆序一个栈
- 用递归函数和栈操作逆序一个栈(每日一道算法题)
- 1栈和队列--仅用递归函数和栈操作逆序一个栈
- 如何仅用递归函数和栈操作逆序一个栈
- 栈和队列之仅用递归函数和栈操作逆序一个栈
- 如何仅用递归函数和栈操作逆序一个栈
- 用递归函数和栈操作逆序一个栈
- 如何仅用递归函数和栈操作逆序一个栈
- 程序员面试指南之如何仅用递归函数和栈操作逆序一个栈
- 重造轮子 用递归函数和栈操作逆序一个栈
- 数据结构 如何仅用递归函数和栈操作逆序一个栈
- 如何仅用递归函数和栈操作逆序一个栈
- 栈和队列之仅用递归函数和栈操作逆序一个栈
- 用递归函数和栈操作逆序一个栈
- 如何仅用递归函数和栈操作逆序一个栈(java实现)