【数据结构】栈与队列(一)

简介: 栈与队列

3.栈与队列


3.1 概述


  • 比较重要,且应用广泛的两种线性结构:栈 Stack、队列 Queue。
  • 栈和队列 与 线性表不同之处:栈和队列可被看成是两种操作受限的特殊线性表。

3.2 栈


3.2.1 定义


  • 栈是一个特殊的线性表,插入和删除只允许在栈顶Top(线性表的尾端)进行操作。
  • 术语:
  • 栈顶Top:允许进行插入和删除的一端。
  • 栈底Bottom
  • 入栈push:栈的插入操作。
  • 出栈pop:栈的删除操作。

image.png

image.png

  • 栈特点:后进先出(Last In First Out、LIFO)、先进后出(First In Last Out、FILO)。

3.2.2 出入栈练习(卡特兰数)


  • 需求:若将ABCD依次入栈,则出栈的序列是?(进出栈可以交替进行)
// 入栈个数 1/2/3/4AinAoutBinBoutCinCoutDinDout-->ABCDAinAoutBinBoutCinDinDoutCout-->ABDCAinAoutBinCinCoutDinDoutBout-->ACDBAinAoutBinCinCoutBoutDinDout-->ACBDAinAoutBinCinDinDoutCoutBout-->ADCBAinBinBoutAoutCinCoutDinDout-->BACDAinBinBoutAoutCinDinDoutCout-->BADCAinBinBoutCinCoutAoutDinDout-->BCADAinBinBoutCinCoutDinDoutAout-->BCDAAinBinBoutCinDinDoutCoutAout-->BDCAAinBinCinCoutDinDoutBoutAout-->CDBAAinBinCinCoutBoutDinDoutAout-->CBDAAinBinCinCoutBoutAoutDinDout-->CBADAinBinCinDinDoutCoutBoutAout-->DCBA

image.png

3.3 顺序栈


3.3.1 定义


  • 顺序栈:使用数组实现的栈。
  • 约定:
  • 空栈:top == 0
  • 满栈:top == stackElem.length
  • 长度:top
  • 栈顶元素:stackElem[top - 1]

3.3.2 栈类


publicclassSqStack {
privateObject[] stackElem;         //栈对象数组privateinttop;                    //长度、下一个存储位置 等}

3.3.3 算法:入栈【重点】


算法1:publicvoidpush(Objectx) {
if(top==stackElem.length) {           //栈满thrownewRuntimeException("栈满");
    } else {
stackElem[top] =x;
top++;
    }
}
算法2:publicvoidpush(Objectx) {
if(top==stackElem.length) {           //栈满thrownewRuntimeException("栈满");
    } else {
stackElem[top++] =x;
    }
}

3.3.4 算法:出栈【重点】


image.png

算法1:publicObjectpop() {
if(top==0) {
returnnull;            //空栈    } else {
top--;
returnstackElem[top];
    }
}
算法2:publicbooleanisEmpty() {      //是否为空returntop==0;
}
publicObjectpop() {
if(isEmpty()) {
returnnull;            //空栈    } else {
returnstackElem[--top];
    }
}

3.4 链栈


3.4.1 定义


  • 使用链式存储的栈,就是链栈。进行插入和删除操作在栈顶进行,也就是链表的尾端。
  • 存储单元2部分组成:数据域 data 和指针域 next。
  • 使用top栈顶指针用于指向栈尾。

image.png

3.4.2 栈类


public class LinkStack {

   private Node top;           //栈顶指针

}

3.4.3 算法:入栈


  • 需求:将新结点p,压入到栈顶
  • image.png
publicvoidpush(Objectx) {
Nodep=newNode(x);       // 创建新结点pp.next=top;               // 1.p的指针域指向栈顶元素top=p;                    // 2.栈顶指针top指向新结点p}

3.4.4 算法:出栈


  • 需求:弹出栈顶元素,需要返回数据

image.png

publicObjectpop() {
if(top==null) {           //空栈 isEmpty()returnnull; 
    } else {
Nodep=top;           // 1 存放栈顶元素top=top.next;         // 2 将top指向栈顶的下一个元素returnp.data;          // 3 返回栈顶元素数据    }
}
相关文章
|
5天前
|
算法 C语言
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
【数据结构与算法 经典例题】使用栈实现队列(图文详解)
|
5天前
|
存储 算法
【数据结构和算法】--队列的特殊结构-循环队列
【数据结构和算法】--队列的特殊结构-循环队列
7 0
|
5天前
|
算法 C语言
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
【数据结构与算法 经典例题】使用队列实现栈(图文详解)
|
2天前
|
存储 算法 调度
算法与数据结构-栈篇
算法与数据结构-栈篇
11 0
|
3天前
|
存储 人工智能 程序员
技术心得记录:堆(heap)与栈(stack)的区别
技术心得记录:堆(heap)与栈(stack)的区别
|
5天前
【海贼王的数据航海】栈和队列
【海贼王的数据航海】栈和队列
5 0
|
5天前
|
算法 程序员 数据处理
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
【数据结构与算法】使用单链表实现队列:原理、步骤与应用
|
5天前
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
5天前
|
算法
【数据结构和算法】---栈和队列的互相实现
【数据结构和算法】---栈和队列的互相实现
7 0
|
5天前
|
存储 测试技术
【数据结构】操作受限的线性表,栈的具体实现
【数据结构】操作受限的线性表,栈的具体实现
16 5