//基于类模板的设计,可直接复制于编程软件上加以运行
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdlib.h>
//基于类模板的设计
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 gettop(Type
&item); //显示当前栈顶元素
void
display(); //显示所有数据元素
private:
Type
*stackspace; //指向栈的指针
int
stacksize; //栈的大小,当为0时,表示栈没有创建空间
int
top; //top栈顶位置,当为-1时,栈为空
};
//栈的初始化
template<class
Type> //此语句关键,需注意
seqstack<Type>::seqstack()
{
stackspace=NULL;
stacksize=0;
top=-1;
}
//创建一个空栈
template<class Type>
seqstack<Type>::seqstack(int
size)
{
stackspace=NULL;
stacksize=0;
top=-1;
create(size);
}
//栈的析构函数
template<class Type>
seqstack<Type>::~seqstack()
{
destroy();
}
//实际栈的创建函数
template<class Type>
bool seqstack<Type>::create(int
size)
{
if(stacksize) //栈已经创建,不能继续创建
return false;
if(size<=0) //size的值必须大于0
return false;
stackspace=new Type[size];
if(!stackspace) //没有申请到存储空间(栈已满)
return false;
stacksize=size;
top=-1;
return true;
}
//销毁栈的函数
template<class Type>
void seqstack<Type>::destroy()
{
if(stackspace)
delete []stackspace;
stackspace=NULL;
top=-1;
stacksize=0;
}
//判断栈是否为空
template<class Type>
bool seqstack<Type>::isempty()
const
{
if(!stackspace)
return true;
return top>=0?false:true;
}
//判断栈是否已满
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(!stackspace)
return false;
if(isfull())
return false;
stackspace[++top]=item;
return true;
}
//出栈函数,不返回栈顶元素
template<class Type>
bool seqstack<Type>::pop()
{
if(empty())
return flase;
top--;
return ture;
}
//出栈函数,但返回栈顶元素
template<class Type>
bool seqstack<Type>::pop(Type
&item)
{
if(isempty()) //判断栈是否为空
return false;
item=stackspace[top--];
return true;
}
//得到栈顶数据元素
template<class Type>
bool seqstack<Type>::gettop(Type
&item)
{
if(isempty())
return false;
item=stackspace[top];
return true;
}
//显示所有数据元素
template<class Type>
void seqstack<Type>::display()
{
if(stacksize)
{
cout<<"目前栈的所有的数据元素为:
";
cout<<"栈底是:→
";
for(int
i=0;i<=top;i++)
cout<<stackspace[i]<<"
";
cout<<"←栈顶"<<endl;
}
else
cout<<"栈尚未建立!"<<endl;
}
//主程序
void main()
{
seqstack<int>
stacknow;//若想输入字符,将此语句中的int改为char即可
char yesno,userchoice='9';
int newstacksize,datain,dataout;
while(1)
{
if(userchoice=='9')
{
system("cls");
cout<<"==================="<<endl
<<"顺序栈的基本操作程序"<<endl
<<"==================="<<endl
<<"1:创建一个栈"<<endl
<<"2:销毁一个栈"<<endl
<<"3:数据进栈"<<endl
<<"4:数据出栈"<<endl
<<"5:显示所有数据元素"<<endl
<<"6:读取栈底元素"<<endl
<<"7:判断栈是否为空"<<endl
<<"8:判断栈是否已满"<<endl
<<"9:清屏"<<endl
<<"0:退出程序"<<endl;
}
cout<<"==================="<<endl
<<"请输入你的选择:
"<<endl;
cin>>userchoice;
if(userchoice=='0')
{
cout<<"程序已经退出,感谢你的使用!"<<endl;
exit(0);
}
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;
}
}
}