数据结构笔记——第三章栈和队列

※栈(限制插入/删除数据的位置)
3.2.1
1.栈的定义
栈是只能在表的一端进行插入删除操作的线性表,允许插入(入栈)和删除(出栈)的一端称为栈顶,另一端称为栈底,不含有任何数据元素的栈称为空栈。
后进先出,即任何时刻出栈的元素都只能是栈顶元素。
设置指示器,记录栈顶位置。
2.栈的抽象数据类型定义(stack)
栈的初始化(构建空栈) 栈的销毁 插入 删除 取栈顶元素 判空
3.2.2 栈的顺序存储结构及实现
1.顺序栈的存储结构
通常把数组元素下表为0的一端作为栈底,附设top变量指向栈顶元素所在数组中的下标
设栈数组长度为stacksize,则设栈为空时栈顶位置top=-1,栈满时栈顶位置为top=stacksize-1。入栈时栈顶位置top+;出栈时栈顶位置top-1.
2.顺序栈的实现

   const int StackSize = 10; //10是示例性的数据,根据实际问题具体定义
   template <typename DataType> //定义模板类SeqStack
   class SeqStack
   {
       public:
         SeqStack( ); //构造函数,初始化一个空栈
         ~SeqStack( ); //析构函数
         void Push( DataType x ); //入栈操作,将元素x入栈
         DataType Pop( ); //出栈操作,将栈顶元素弹出
         DataType GetTop( ); //取栈顶元素(并不删除)
         int Empty( ); //判断栈是否为空
      private:
         DataType data[StackSize]; //存放栈元素的数组
         int top; //游标,栈顶指针,为栈顶元素在数组中的下标
    };  

  ①构造函数——顺序栈初始化
     将栈顶指针top置为-1.
  ②析构函数为空
  ③入栈操作
     插入元素x需要将栈顶位置top+1,然后在top的位置填入x。
     template <typename DataType>
     void SeqStack<DataType> :: Push(DataType x)
     {
       if (top == StackSize - 1) throw "上溢";
       data[++top] = x;
     }
  ④出栈操作
     取出栈顶元素,然后栈顶位置top-1.
     template <typename DataType>
     DataType SeqStack<DataType> :: Pop( )
    {
      DataType x;
      if (top == -1) throw "下溢";
      x = data[top--];
      return x;
    }
  ⑤取栈顶元素
    将top位置的栈顶元素取出并返回
    template <typename DataType>
   DataType SeqStack<DataType> :: GetTop( )
  {
    if(top == -1)
    throw "下溢异常";
    else
     return data[top];
  }
 ⑥判空操作
   判断top是不是-1
   template <typename DataType>
   int SeqStack<DataType> :: Empty()
  {
    if(top == -1)
    return 1;
    else 
     return 0;
  }

3.2.3栈的链接存储结构及实现
1.栈链的存储结构
因为只能在栈顶执行插入和删除操作,故以单链表头部做栈顶方便而且没必要设置头结点。
2.操作
构造函数(链栈的初始化)
析构函数
入栈操作(只需要处理栈顶)
出栈操作(只需处理栈顶)
取栈顶元素 (只需返回栈顶指针top所指结点的数据域,并不修改栈顶指针)
判空操作(判断top指针是否为空)
3.2.4 顺序栈和链栈的比较
元素个数变化较大用链栈,反之用顺序栈。

※队列
3.3.1 队列的逻辑结构
队列是只允许在一端进行插入操作(入队,队尾),在另一端进行删除操作(出队,队头)的线性表。
特点:先进先出
3.3.2 队列的顺序存储结构及实现
1.队列的顺序存储结构(顺序队列)
设置队头队尾两个位置变量front和rear。入队时入队时rear加1,出队时front加1。规定:front指向队头元素的前一个位置,rear指向队尾元素的位置。
2.循环队列的存储结构
作用:解决假溢出问题 假溢出:当元素被插入到数组中下标最大的位置后,数组空间就备用尽了,但此时数组低端还有空闲空间。
方法:拖尾相接,即允许队列直接从数组下边最大的位置延续到下标最小的位置。可以通过取余实现。设存储队列的数组长度为QueueSize,操作语句为rear=(rear+1)%QueueSize
判断队空/队满:front=rear 为了区分队空队满,可以浪费一个存储空间,使队尾和队首位置相差为1,即 (rear+1)% QueueSize=front
3.3.3 队列的链式存储结构及实现
1.链队列的存储结构
为使空队列和非空队列操作一样,设置头结点。
根据先入先出特性,设置队头(删除)指针指向链队列的头结点,队尾(插入)指针指向终端节点。
2.链队列的实现
出队操作时,出队后判断出队前队列长度是否为1 :if(p-next=nullptr) rear=front;

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值