栈和队列
栈:限定仅在表尾进行插入和删除操作的线性表。
栈又称为后进先出的线性表。简称LIFO结构
基本概念:栈顶(top)、栈底(bottom)、
栈的插入(push)操作又称作 进栈 也称作 压栈、入栈
栈的删除 (pop) 操作又称作 出栈 也称作 弹栈
栈的存储结构
栈的顺序存储结构
进栈、出栈 的操作 时间复杂度均为O(1)
两栈共享空间(前提:相同的数据类型的栈)
top1+1=top2
栈的链式存储结构
链栈不需要头结点
栈顶放在单链表的头部。
空栈:top = NULL
进栈、出栈 的时间复杂度均为O(1)
对于链栈来说,基本不存在栈满的情况。一旦出现,计算机操作系统将面临死机崩溃。
================================
栈的作用----递归。。。。。
================================
栈的应用---四则运算表达式求值
中缀表达式,,即我们一般使用的计算式,,运算符号在数字之间
-----------------------
后缀表达式 ,,即数字在前,运算符在后,,计算机喜好的表达方式。。。
规则:数字进栈,遇到符号(符号前的两个栈顶数字)出栈计算,得到的结果进栈,依次进行。。。。
--------------------------------
中缀表达式到 后缀表达式的转换:
规则:从左到右遍历中缀表达式中的每个字符和数字,数字则输出,若是符号,则判断其与栈顶符号的优先级,
若是右括号或优先级低于栈顶符号(加减低于乘除)的,则栈顶元素出栈并输出,并将当前符号进栈,一直到最后输出后缀表达式为止。。。。
===========================================
队列
队列:只允许在一端(队尾)进行插入操作,在另一端(队头)进行删除操作的线性表。
先进先出(FIFO)
---------------------
顺序队列基本概念:front rear
front指向对头元素,rear 指向队尾元素的下一个位置。
front = rear 时为空队列。。
假溢出问题,即队尾占满,队头有剩余空间。。。造成浪费,于是有了循环队列。。。
-----------------------
循环队列:把顺序队列头尾相接的顺序结构存储结构称之为 循环队列。。。
使得原本的顺序队列的删除和插入操作的时间复杂度由O(n)变为了O(1)。
两点:1)判断循环队列的空满问题
a。设置flag标志变量,
front = rear , flag = 0 空队列;
front = rear , flag = 1 满队列。
b。(rear+1)%QueueSize == front
2)队列的长度问题
a。rear > front
(rear - front)%QueueSize
b。rear < front
(rear - front + QueueSize)%QueueSize
-----------------------------
队列的链式存储结构
简称:链队列
队头指针指向链队列的头结点
入队、出队
========================
总的来说,在可以确定队列长度最大值的情况下,建议使用循环队列,如果无法预估队列的长度的时候,建议使用链式队列。。。。
浙公网安备 33010602011771号