基于visual Studio2013解决面试题之0703翻转栈




题目



解决代码及点评

 
 
 
 
/*
	用递归颠倒一个栈。例如输入栈{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调试器”运行


程序运行结果









转载于:https://www.cnblogs.com/new0801/p/6177341.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值