顺序栈

 

#include <iostream>
#include <assert.h>

using namespace std;

const int maxsize = 100;
const int stackIncreament = 20; //栈溢出时扩展空间的增量

template<class T>
class SeqStack
{
public:

 SeqStack(int sz = 100);    //建立一个空栈
 ~SeqStack(void){delete []elements;}

 void Push(const T& x);
 bool Pop(T& x);
 bool getTop(T& x);
 bool IsEmpty()const
 {
  return (top == -1)? true:false;
 }
 bool IsFull()const
 {
  return (top == maxsize-1)?true:false;
 }
 int getSize()const
 {
  return top+1;
 }
 //清空栈的内容
 void Makeempty()
 {
  top = -1;
 }

 //输出栈中元素的重载操作<<
 template<class T>   //声明时也要加上 (VS2008)
 friend std::ostream& operator<<(ostream& os,SeqStack<T>& s);

private:
 T* elements;            //存放栈中元素的栈数组
 int top;                //栈顶指针
 int maxsize;            //占栈可容纳的最多的元素的个数
 void overflowProcess(); //栈的溢出处理

};

template<class T>
void SeqStack<T>::overflowProcess()
{
 T* newArray = new T[maxsize + stackIncreament];
 if(newArray == NULL)
 {
  cerr<<"增量分配空间失败!"<<endl;
  exit(1);
 }
 for(int i=0;i<=top;i++)
  newArray[i] = elements[i];
 maxsize = maxsize+stackIncreament;
 delete []elements;
 elements = newArray;
}

template<class T>
SeqStack<T>::SeqStack( int sz)
:top(-1)
,maxsize(sz)
{
 //创建一个尺寸为sz的空栈
 elements = new T[maxsize];
 //断言是否分配成功
 assert(elements != NULL);
}


template<class T>
bool SeqStack<T>::getTop( T& x )
{
 if(IsEmpty())
  return false;
 x = elements[top];
 return true;
}

template<class T>
bool SeqStack<T>::Pop( T& x )
{
 if(IsEmpty())
  return false;
 x = elements[top--];
 return true;
}

template<class T>
void SeqStack<T>::Push( const T& x )
{
 if(IsFull()==true)
  overflowProcess();
 elements[++top] = x;
}


template<class T>
std::ostream& operator<<(ostream& os,SeqStack<T>& s)
{
 os<<"top ="<<s.top<<endl;  //输出栈顶的位置
 for(int i=0;i<=s.top;i++)  //逐个输出栈中的元素的值
  os<<i<<":"<<s.elements[i]<<endl;
 return os;
}

 

int main()
{
 int a[5] = {6,7,8,9,10};
 SeqStack<int> stack1(5);
 for(int i=0;i<5;i++)
  stack1.Push(a[i]);
 int b;
 stack1.Pop(b);
 stack1.getTop(b);
 if(stack1.IsFull())
  cout<<"Yes!"<<endl;
 else
  cout<<"No!"<<endl;
 cout<<"Top = "<<b<<endl;
 cout<<"Size = "<<stack1.getSize()<<endl;
 cout<<stack1<<endl;  //隐含调用了友元重载后的"<<"运算符
 return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值