题目
解决代码及点评
/*
用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5}, 1 在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},
5 处在栈顶。
*/
#include <iostream>
using namespace std;
template <class T>
class Stack
{
public:
Stack(int Len = 10); //默认栈的大小为10
~Stack() { delete[] pArr;}
void Push(T value);
void Pop();
T Top();
void Reverse( int n); //递归翻转一个栈 不得申请额外空间
void AddToBottom(T value); //将元素value压入栈底
bool IsEmpty();
bool IsFull();
private:
int nTop; //指向下一个要插入的位置
int nLen; //栈的总大小
T *pArr;
};
template<class T>
Stack<T>::Stack(int Len)
{
if (Len <= 0)
{
return;
}
nLen = Len;
nTop = 0;
pArr = new T[nLen];
}
template<class T>
void Stack<T>::Push(T value)
{
if (nTop == nLen)
{
cout<<"栈已满!"<<endl;
return;
}
pArr[nTop++] = value;
}
template<class T>
void Stack<T>::Pop()
{
if (nTop == 0)
{
cout<<"栈为空!"<<endl;
return;
}
nTop--;
}
template<class T>
T Stack<T>::Top()
{
if (nTop == 0)
{
cout<<"栈为空!"<<endl;
}
else
{
return pArr[nTop - 1];
}
}
template<class T>
bool Stack<T>::IsEmpty()
{
return nTop == 0;
}
template<class T>
bool Stack<T>::IsFull()
{
return nTop == nLen;
}
bool IsSubPop(int *pArr1, int *pArr2, int nLen)
{
Stack<int> s;
int j = 0;
for (int i = 0; i < nLen; i++)
{
s.Push(pArr1[i]);
while (!s.IsEmpty() && s.Top() == pArr2[j])
{
s.Pop();
j++;
}
}
return s.IsEmpty();
}
template<class T>
void Stack<T>::AddToBottom(T value) //将元素value压入栈底
{
if (IsEmpty())
{
Push(value);
}
else
{
T topValue = Top();
Pop();
AddToBottom(value);
Push(topValue);
}
}
template<class T>
void Stack<T>::Reverse(int n) //递归翻转一个栈 不得申请额外空间
{
// n==0是结束条件
if (n == 0)
{
return;
}
else
{
// 获取top元素后弹出
T topValue = Top(); //取出栈顶元素
Pop();
// 递归翻转
Reverse(n-1); //翻转n-1个元素
AddToBottom(topValue); //将栈顶元素压入栈底
}
}
int main()
{
Stack<int> s;
for (int i = 0; i < 5; i++)
{
s.Push(i);
}
// 翻转
s.Reverse(5);
while (!s.IsEmpty())
{
cout<<s.Top()<<endl;
s.Pop();
}
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果