qq_42660156
追忆~似水年华
采纳率48%
2019-07-29 18:31

C++的这个有类模板的代码怎么改成三个文件(seqstack.h、seqstack.cpp、main.cpp)?具体代码是怎么样的?

//功能:顺序栈的功能演示
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
//以下为栈的定义部分,如果用工程建立程序,可以另外启用文件seqstack.h
/*
模板顺序栈类seqstack的定义说明
*/
template <class Type> 
class seqstack
{
public:
    seqstack();//创建一个空栈
    seqstack(int size);//创建一个可以容纳size个元素的栈
    ~seqstack();//回收一个栈
    bool create(int size);//实际创建一个可以容纳size个元素的栈
    void destroy();//销毁一个栈
    bool isempty() const;//确定栈是否已空
    bool isfull() const;//确定栈是否已满
    bool push(Type &item);//数据进栈
    bool pop();//数据出栈
    bool pop(Type &item);//数据出栈并返回出栈前的栈顶
    bool getpop(Type &item);//取出当前栈顶数据
    void display();//显示栈的所有元素
private:
    Type *stackspace;//栈空间的具体实现,在下面通过动态申请空间建立数组
    int stacksize;//栈的大小,当为0时,栈没有创建空间
    int top;//栈顶位置,当为-1时,栈为空
};

//以下为栈的实现部分,如果用工程建立程序,可以另外启用文件seqstack.cpp
template <class Type>
seqstack<Type>::seqstack()//创建一个空栈
{
    stackspace=NULL;//初始化,空间起始地址为空
    stacksize=0;//栈的大小,初始值为0,表示目前还没有建立
    top=-1;//栈顶位置,当为-1时,栈为空
}

template <class Type>
seqstack<Type>::seqstack(int size)//创建一个可以容纳size个元素的栈
{
    stackspace=NULL;//初始化,空间起始地址为空
    stacksize=0;//栈的大小,初始值为0,表示目前还没有建立
    top=-1;//栈顶位置,当为-1时,栈为空
    create(size);//开始用size大小为参数建立栈的空间
}

template <class Type>
seqstack<Type>::~seqstack()//回收一个栈
{
    destroy();//析构函数,释放相关空间
}

template <class Type>
bool seqstack<Type>::create(int size)//实际创建一个可以容纳size个元素的栈
{
    if(stacksize)//栈已经存在,不能再创建
        return false;
    if(size<=0)//size的值必须大于零
        return false;
    stackspace=new Type[size];//申请动态数组空间
    if(!stackspace)//没有申请到存储空间,创建栈不成功
        return false;
    stacksize=size;//申请到存储空间,创建栈成功,大小为size
    top=-1;//栈刚建立成功时,栈顶指针为-1
    return true;
}

template <class Type>
void seqstack<Type>::destroy()//销毁一个栈
{
    if(stackspace)
        delete [] stackspace;//释放栈的空间,还给操作系统
    stackspace=NULL;//空间起始地址恢复为空
    stacksize=0;//栈的大小恢复为初始值0,表示目前还没有建立
    top=-1;//栈顶指针恢复为-1
}

template <class Type>
bool seqstack<Type>::isempty() const//确定栈是否已空
{
    if(!stacksize)//确定栈是否被创建,没有创建视为空
        return true;
    return top==-1?true:false;//根据栈顶指针的位置返回是否为空
}

template <class Type>
bool seqstack<Type>::isfull() const//确定栈是否已满
{
    if(!stacksize)//确定栈是否被创建,没有创建视为空
        return true;
    return top==stacksize-1?true:false;//根据栈顶指针的位置返回是否为满
}

template <class Type>
bool seqstack<Type>::push(Type &item)//数据进栈
{
    if(!stacksize)//如果栈没有被创建,则不能执行进栈操作
        return false;
    if(isfull())//如果栈空间已满,则不能执行进栈操作
        return false;
    stackspace[++top]=item;//实际进栈的操作,具体分为两步:先产生地址,后插入数据
    return true;//返回成功标志
}

template <class Type>
bool seqstack<Type>::pop()//数据出栈
{
    if(isempty())//如果栈空间已经为空,则不能执行出栈操作
        return false;
    top--;//执行出栈操作,栈顶指针减1
    return true;//返回成功标志
}

template <class Type>
bool seqstack<Type>::pop(Type &item)//数据出栈并返回出栈前的栈顶
{
    if(isempty())//如果栈空间已经为空,则不能执行进栈操作
        return false;
    item=stackspace[top--];//执行出栈操作,把栈顶数据保存起来返回,栈顶指针减1
    return true;//返回成功标志
}

template <class Type>
bool seqstack<Type>::getpop(Type &item)//取出当前栈顶数据
{
    if(isempty())//如果栈空间已经为空,则不能执行进栈操作
        return false;
    item=stackspace[top];//把栈顶数据保存起来返回
    return true;//返回成功标志
}

template <class Type>
void seqstack<Type>::display()//显示栈的所有元素
{
    if(!stacksize)//当栈中没有数据时则放弃显示所有数据
        cout<<"栈尚未建立!"<<endl;
    else//当栈中有数据时则显示所有数据
    {
        cout<<"目前栈中的内容是:";
        cout<<"栈底■";
        for(int i=0;i<=top;i++)//栈的空间从0到top指向的位置
            cout<<stackspace[i]<<" ";//输出每一个数据,同时间隔一个空格
        cout<<"←top栈顶"<<endl;
    }
}

/*
定义一个实现顺序栈功能的菜单处理类interfacebase
*/
template <class Type>
class interfacebase
{
private:
    seqstack<Type> seqstackonface;
public:
    void clearscreen(void);//清屏
    void showmenu(void);//显示菜单函数
    int userchoice(void);//用户的选项
    void processmenu(int menuchoice);//菜单函数
};

template <class Type>
void interfacebase<Type>::clearscreen(void)
{
    system("cls");
}

template <class Type>
void interfacebase<Type>::showmenu(void)
{
    cout<<"顺序栈基本功能菜单"<<endl;
    cout<<"=================="<<endl;
    cout<<"1.创建一个栈"<<endl;
    cout<<"2.销毁一个栈"<<endl;
    cout<<"3.数据进栈(仅限整数)"<<endl;
    cout<<"4.数据出栈"<<endl;
    cout<<"5.显示栈中全部数据"<<endl;
    cout<<"6.读取栈顶数据"<<endl;
    cout<<"7.判断是否空栈"<<endl;
    cout<<"8.判断是否满栈"<<endl;
    cout<<"0.退出"<<endl;
    cout<<"=================="<<endl;
}

template <class Type>
int interfacebase<Type>::userchoice(void)
{
    int menuchoice;
    cout<<"请输入您的选择:";
    cin>>menuchoice;
    return menuchoice;
}

template <class Type>
void interfacebase<Type>::processmenu(int menuchoice)
{
    int size;
    Type item;
    switch(menuchoice)//根据用户的选择进行相应的操作
    {
    case 1:
        cout<<"请输入栈的大小:";
        cin>>size;
        seqstackonface.create(size);
        cout<<"栈的大小为:"<<size;
        break;
    case 2:
        seqstackonface.destroy();
        cout<<"栈已销毁!"<<endl;
        break;
    case 3:
        cout<<"请输入进栈数据:";
        cin>>item;
        seqstackonface.push(item);
        cout<<"数据已进栈!"<<endl;
        break;
    case 4:
        seqstackonface.pop(item);
        cout<<"出栈数据:"<<item<<endl;
        cout<<"数据已出栈!"<<endl;
        break;
    case 5:
        seqstackonface.display();
        cout<<"已遍历栈中全部数据!"<<endl;
        break;
    case 6:
        seqstackonface.getpop(item);
        cout<<"当前栈顶数据为:"<<item<<endl;
        break;
    case 7:
        if(seqstackonface.isempty())
            cout<<"栈已空!"<<endl;
        else
            cout<<"栈未空!"<<endl;
        break;
    case 8:
        if(seqstackonface.isfull())
            cout<<"栈已满!"<<endl;
        else
            cout<<"栈未满!"<<endl;
        break;
    case 0:
        exit(0);
    default:
        cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
        break;
    }
}

/*
程序主入口
*/
void main(void)
{
    int menuchoice;//定义变量,菜单选单项的选择
    interfacebase<int> interfacenow;
    seqstack<int> seqstacknow;
    system("color f0");//修改屏幕的背景色和字的颜色
    interfacenow.clearscreen();//清屏
    while(1)//永真循环
    {
        interfacenow.showmenu();//显示菜单
        menuchoice=interfacenow.userchoice();//获取用户的选择
        interfacenow.processmenu(menuchoice);//处理用户的选择
        system("pause");//暂停
        interfacenow.clearscreen();//清屏
    }
}//主函数结束

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答