数据结构第三章

栈是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底。

  不含任何数据元素的栈称为空栈。

  栈还有后进先出的特性。

  栈的顺序存储结构称为顺序栈。

  顺序栈的类的声明

const int  MAX_SIZE=100;

template <class DataType>

class seqStack

{

   public:

       seqStack ( ) ;

       ~seqStack ( );

       void  Push ( DataType  x );

       DataType   Pop ( );

       DataType   GetTop ( );

       bool  Empty ( );

   private:

       DataType  data[MAX_SIZE];

       int  top;

}

入栈

  template<class DataType>

void seqStack<DataType> ::Push ( DataType  x)

{

    if (top == MAX_SIZE-1)  throw  “溢出”;

    top++;

    data[top] = x;

 }

  出栈

template <class  DataType>

DataType seqStack<DataType> :: Pop ( )

{

    if (top == -1)  throw  “溢出”;

    x = data[top--];

    return  x;

}

两栈共享空间的类的声明

const int Stack_Size=100; 

template <class DataType>

class BothStack

{

 public:

      BothStack( );

      ~BothStack( );

      void Push(int i, DataType x);  

      DataType Pop(int i);         

      DataType GetTop(int i);      

      bool Empty(int i);    

  private:

      DataType data[Stack_Size];    

      int top1, top2;       

};

 

  栈的链接存储结构称为链栈。

链栈的类的声明

template <class DataType>

class LinkStack

{   

  public:

        LinkStack( );

        ~LinkStack( );           

        void Push(DataType x);

        DataType Pop( );

        DataType GetTop( );

        bool Empty( );

  private:

        Node<DataType> *top;

}

插入

template <class DataType>

void LinkStack<DataType> ::Push(DataType x)

{

   s = new Node<DataType>;

   s->data = x;

   s->next = top;

  top = s;

}

 

  队列是只允许在一端进行插入操作,另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。

队空和队满的判定方法

方法一:附设一个存储队列中元素个数的变量num,当num=0时队空,当num=QueueSize时为队满;

方法二:修改队满条件,浪费一个元素空间,队满时数组中只有一个空闲单元;

方法三:设置标志flag,当front=rear且flag=0时为队空,当front=rear且flag=1时为队满。

  队列的首尾相接的顺序存储结构称为循环队列。

循环队列的类的声明

const int QueueSize=100;

template <class DataType>   

class CirQueue

{

 public:

     CirQueue( );

     ~ CirQueue( );

     void EnQueue(DataType x);

    DataType DeQueue( );            

    DataType GetQueue( );

    bool Empty( );

 private:

    DataType data[QueueSize];  

    int front, rear;

};

入队

const int QueueSize=100;

template <class DataType>   

class CirQueue

{

 public:

     CirQueue( );

     ~ CirQueue( );

     void EnQueue(DataType x);

    DataType DeQueue( );            

    DataType GetQueue( );

    bool Empty( );

 private:

    DataType data[QueueSize];  

    int front, rear;

};

出队

template <class DataType>

DataType CirQueue<DataType> ::DeQueue( )

{

    if (rear == front) throw "下溢";

    front = (front + 1) % QueueSize;

    return data[front];

}

读取队头元素

template <class DataType>

DataType CirQueue<DataType> ::GetQueue( )

{

   if (rear == front) throw "下溢";

   i = (front + 1) % QueueSize; 

   return data[i];

}

链队列类的声明

template <class DataType>

class LinkQueue

{  

 public:

     LinkQueue( );    

     ~LinkQueue( );

     void EnQueue(DataType x);

     DataType DeQueue( );      

     DataType GetQueue( );

     bool Empty( );

 private:

     Node<DataType> *front, *rear;

};

构造函数

template <class DataType>

class LinkQueue

{  

 public:

     LinkQueue( );    

     ~LinkQueue( );

     void EnQueue(DataType x);

     DataType DeQueue( );      

     DataType GetQueue( );

     bool Empty( );

 private:

     Node<DataType> *front,*rear;

};

入队

template <class DataType>

void LinkQueue<DataType> ::EnQueue(DataType x)

{

   s = new Node<DataType>;

   s->data = x;

   s->next = NULL;

   rear->next = s;

   rear = s;

}

出队

template <class DataType>

DataType LinkQueue<DataType> ::DeQueue( )

{

    if (rear == front) throw "下溢";

    p = front->next;

    x = p->data;

    front->next = p->next;       

    if (p->next == NULL)  rear =front;  

    delete p;

    return x;

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值