#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;
}
}
}