目录
一、栈
1栈
1顺序栈
1.判空
2.进栈
3.出栈
4.读取栈顶元素
2共享栈
共享栈的结构
共享栈进栈操作
编辑
3链栈
链栈的结构
链栈的操作
2应用
1、括号匹配:
如何将中缀表达式转换成后缀表达式?
2、表达式求值:
3、递归:
1.阶乘
2.斐波那契数列
二、队列
1顺序队列
2循环队列
循环队列的操作
1入队
2出队
那如何分辨队列是空还是满呢?
方法一:
方法二:
3链式队列
链式队列的操作
1入队
2出队
4双端队列
一、栈
栈(Stack):只允许在一端进行插入或删除操作的线性表。
栈顶(Top):线性表允许进行插入和删除的那一端。
栈底(Bottom):固定的,不允许进行插入和删除的另一端
特点: 1.栈是受限的线性表,所以自然具有线性关 系。
2.栈中元素后进去的必然先出来,即后进先出 LIFO(Last In First Out)
栈是线性表的特例,那栈的顺序存储也是线性表顺序存储的简化。栈顺序存储结构也叫作顺序栈。
顺序栈的存储空间大小需要事先开辟好,很多时候对每个栈各自单独开辟存储空间的利用率不如将各个栈的存储空间共享
栈是线性表的特例,线性表的存储结构还有链式存储结构,所以也可以用链表的方式来实现栈。栈的链式存储结构也叫作链栈。
特点 1.链栈一般不存在栈满的情况。
2.空栈的判定条件通常定为top==NULL;
1进栈
2出栈
假设有两种括号,一种圆的(),一种方的[],嵌套的顺序是任意的。
算法思想:若是左括号,入栈;若是右括号,出栈一个左括号判断是否与之匹配;检验到字符串尾,还要检查栈是否为空。只有栈空,整个字符串才是括号匹配的。
1.按运算符优先级对所有运算符和它的运算数加括号。(原本的括号不用加)
2.把运算符移到对应的括号后。
3.去掉括号。
规则:从左到右扫描表达式的每个数字和符号,遇到数字就进栈,遇到符号就将处于栈顶的两个数字出栈然后跟这个符号进行运算,最后将运算结果进栈,直到最终获得结果。
要理解递归,你要先理解递归,直到你能理解递归。 如果在一个函数、过程或数据结构的定义中又应用了它自身,那么这个函数、过程或数据结构称为是递归定义的,简称递归。递归最重要的是递归式和递归边界。
时间复杂度:O(NlogN)
时间复杂度 :O(2^n)
队列是只允许在一端进行插入,而在另一端进行删除的线性表
队头(Front):允许删除的一端,又称为队首。
队尾(Rear): 允许插入的一端。
先进入队列的元素必然先离开队列,即先进先出(First In First Out)简称FIFO
用数组来实现队列,可以将队首放在数组下标为0的位置。
把数组“掰弯”,形成一个环。Rear指针到了下标为4的位置还能继续指回到下标为0的地方。这样首尾相连的顺序存储的队列就叫循环队列
入队:rear=(rear+1)%MaxSize
出队:front=(front+1)%MaxSize
设置标志位tag,当tag=0且rear等于front时为队列空即当tag=1且rear等于front时为队列满即tag==0&&front==rear。当tag=1且rear等于front时为队列满即tag==1&&front==rear。
每次删除成功操作时,都令tag=0;所以tag==1&&front==rear队空
每次插入成功操作时。都令tag=1;tag==1&&front==rear 队满
我们把front=rear仅作为队空的判定条件。当队列满的时候,令数组中仍然保留一个空余单元。我们认为这种情况就是队列满了。
队列的链式存储结构,其实就是线性表的单链表,只不过需要加点限制,只能表尾插入元素,表头删除元素。
为了方便操作,我们分别设置队头指针和队尾指针,队头指针指向头结点,队尾指针指向尾结点。
1.入队:我们知道队列只能从队尾插入元素,队头删除元素。于是入队就是在队尾指针进行插入结点操作。链队的插入操作和单链表的插入操作是一致的。
2.出队:出队就是头结点的后继结点出队,然后将头结点的后继改为它后面的结点。
双端队列是指允许两端都可以进行入队和出队操作的队列