栈和队列——顺序栈

栈的特性:后进先出
1.

  • 顺序栈:用一维数组实现。
    通常把数组下标为0的一端作为栈底,设指针top指示栈顶元素在数组中的位置。
    栈元素的数组长度为StackSize,则栈空时栈顶指针top=-1,栈满时栈顶指针top=StackSize-1;入栈top加一,出栈top减一。
    ①顺序栈的声明:
const  int  MAX_SIZE=100;
template  <class T>
class  seqStack
{
    public:
        seqStack ( ){top=-1;}   //构造函数,初始化一个空栈
        ~seqStack ( ){}   //析构函数为空
        void  Push ( T  x );    //入栈操作,将元素x入栈
        T   Pop ( );   //出栈操作,将栈顶元素弹出
        T   GetTop ( );   //取栈顶元素
        bool  Empty ( );    //判断栈是否为空
    private:
        T  data[MAX_SIZE];  //存放栈元素的数组
        int  top;   //栈顶指针,为栈顶元素在数组中的下标
}

②入栈

template <class T>
void  seqStack<T>::Push ( T  x)
{
     if (top==MAX_SIZE-1)  throw  “溢出”;
     top++;
     data[top]=x;
 } 

③判断是否为空

template <class T>
bool  seqStack<T>::Empty ()
{
     if (top==-1)  
         return true;
     return false;
 } 

④取栈顶元素

template <class T>
T  seqStack<T>::GetTop ( )
{
     if (Empty()) throw  ”空栈” ;
     return data[top];
 }

⑤出栈

template  <class  T>
T  seqStack<T>:: Pop ( )
{
     if (top==-1)  throw  “溢出”; 
     x=data[top];
      top--;
     return  x;
}

两栈共享空间
栈空:top1=-1,top2=StackSize.
栈满:top1=top2-1.
①类的声明

const int Stack_Size=100;  
template <class T>
class BothStack 
{
  public:
       BothStack( );
       ~BothStack( ); 
       void Push(int i, T x);   
       T Pop(int i);          
       T GetTop(int i);       
       bool Empty(int i);     
  private:
       T data[Stack_Size];     
       int top1, top2;        
};

②入栈

  1. 如果栈满,则抛出上溢异常;
  2. 判断是插在栈1还是栈2;
    2.1 若在栈1插入,则
    2.1.1 top1加1;
    2.1.2 在top1处填入x;
    2.2 若在栈2插入,则
    2.2.1 top2减1;
    2.2.2 在top2处填入x;

template <class T> 
void BothStack<T>::Push(int i, T x )
{
    if (top1==top2-1) 
		throw "上溢";
    if (i==1) 
		data[++top1]=x;
    if (i==2) 
		data[--top2]=x;
}

③删除
1.若是在栈1删除,则
1.1 若栈1为空栈,抛出下溢异常;
1.2 删除并返回栈1的栈顶元素;
2. 若是在栈2删除,则
2.1 若栈2为空栈,抛出下溢异常;
2.2 删除并返回栈2的栈顶元素;

template <class T>
T BothStack<T>::Pop(int i){
    if (i==1) {   
        if (top1== -1) 	throw "下溢";
        return data[top1--];
    }
    if (i==2) {                           
        if (top2==StackSize)  	throw "下溢";
        return data[top2++]; 
   }
}

④判断某个栈空的方法

template <class T> 
bool BothStack<T>::Empty(int i)
{  
    if(i==1){
        if(top1==-1) 	return 1;
        else 	return 0;
    }
    if(i==2)	{
        if(top2==StackSize)	return 1;
        else  return 0;
    }
}

⑤取某个栈栈顶的算法

template <class T>  T BothStack<T>::GetTop(int i) {
    if(i==1)	{
        if (top1!=-1) 	return data[top1];
    }
    if(i==2)	{
        if(top2!=StackSize)  return data[top2];  
     } 
  }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值