顺序栈基于类模板的设计(C++ 数据…

//基于类模板的设计,可直接复制于编程软件上加以运行
#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;
  }

 
 }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值