//功能:顺序栈的功能演示
#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();//清屏
}
}//主函数结束