#include
#include
#include
#include
//模板顺序栈类seqstack的定义说明。
template 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 gettop(Type & item); //取出当前栈顶数据。
void display(); //显示栈的所有元素
private:
Type * stackspace; //指向栈。
int stacksize; //栈的大小,当为0时,栈没有创建空间。
int top; //栈顶位置,当为-1时,栈为空。
};
//以下为栈数据结构实现部分,如果用工程建立程序,可以另外存入文件seqstack.cpp
template
seqstack::seqstack()
{
stackspace=NULL;
stacksize=0;//栈的大小,当为0时,栈没有创建空间。
top=-1;//栈顶位置,当为-1时,栈为空。
}
template
seqstack::seqstack(int size)
{
stackspace=NULL;
stacksize=0;
top=-1;
create(size);
}
template
seqstack::~seqstack()
{
destroy();
}
template
bool seqstack::create(int size)
{
if(stacksize) //栈已经存在,不能再创建
return false;
if(size<=0) //size的值必须大于零。
return false;
stackspace=new Type[size];
if(!stackspace) //没有申请到存储空间,创建栈不成功。
return false;
stacksize=size;
top=-1;
return true;
}
template
void seqstack::destroy()
{
if(stackspace)
delete [] stackspace;
stackspace=NULL;
stacksize=0;
top=-1;
}
template
bool seqstack::isempty() const
{
if(!stacksize) //确定栈是否被创建。没有创建视为空。
return true;
return top>=0 ? false : true ;
}
template
bool seqstack::isfull() const
{
if(!stacksize) //确定栈是否被创建。没有创建视为满。
return true;
return top==stacksize-1 ? true : false;
}
template
bool seqstack::push(Type & item)
{
if(!stacksize) //确定栈是否被创建。
return false;
if(isfull()) //确定栈是否装满。
return false;
stackspace[++top]=item;
return true;
}
template
bool seqstack::pop()
{
if(isempty()) //确定栈是否为空。
return false;
top--;
return true;
}
template
bool seqstack::pop(Type & item)
{
if(isempty())
return false;
item=stackspace[top--];
return true;
}
template
bool seqstack::gettop(Type & item)
{
if(isempty())
return false;
item=stackspace[top];
return true;
}
template
void seqstack::display()
{
if(stacksize)
{
cout<<"目前栈中的内容是: ";
cout<<"栈底■";
for(int i=0;i<=top;i++)
cout<<stackspace[i]<<" ";
cout<<"←top栈顶"<<endl;
}
else
cout<<"栈尚未建立!"<<endl;
}
//主程序开始
void main(void)
{
seqstack stacknow;
char yesno,userchoice='9'; //先进行一次清屏
int newstacksize,datain,dataout;
while(1)
{
if(userchoice=='9')
{
system("cls");
cout<<"***************************************"<<endl;
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<<"** 9: ***清屏*** **"<<endl;
cout<<"** 0: 退出。 **"<<endl;
cout<<"***************************************"<<endl;
}
cout<<"请选择:";
cin>>userchoice;
if(userchoice=='0') //退出程序
break;
switch(userchoice)
{
case '1'://必须先创建一个栈,才能压入数据
cout<<"开始创建栈,请输入栈空间大小:";
cin>>newstacksize;
if(stacknow.create(newstacksize))
cout<<"创建成功,栈空间大小是:"<<newstacksize<<endl;
else
cout<<"创建失败!"<<endl;
break;
case '2'://销毁一个栈
cout<<"你真的要销毁栈吗?请输入(Y/y)确定:";
cin>>yesno;
if(yesno=='Y'||yesno=='y')
{
stacknow.destroy();
cout<<"栈已经销毁!"<<endl;
}
break;
case '3'://把数据压入栈
cout<<"向栈压入数据:";
cin>>datain;
if(stacknow.push(datain))
{
cout<<"数据 "<<datain<<" 已成功进栈!"<<endl;
stacknow.display();
}
else
cout<<"数据 "<<datain<<" 进栈失败!"<<endl;
break;
case '4'://从栈中弹出数据
if(stacknow.pop(dataout))
{ cout<<"从栈中成功地弹出数据:"<<dataout<<endl;
stacknow.display();
}
else
cout<<"出栈操作失败"<<endl;
break;
case '5':
stacknow.display();
break;
case '6':
if(stacknow.gettop(dataout))
{ cout<<"栈顶数据为:"<<dataout<<endl;
stacknow.display();
}
else
cout<<"取栈顶数据操作失败"<<endl;
break;
case '7'://栈是否已空
if(stacknow.isempty())
cout<<"目前是空栈或者栈尚未建立。"<<endl;
else
cout<<"目前是非空栈。"<<endl;
break;
case '8'://栈是否已满。
if(stacknow.isfull())
cout<<"目前是满栈或者栈尚未建立。"<<endl;
else
cout<<"目前栈不满,还可以继续进栈。"<<endl;
break;
case '9':
break;
default:
cout<<"对不起,输入命令有错!"<<endl;
break;
}
}
}