栈和队列的定义

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(6) 从链队中删除一个元素
ElemType QDelete(LinkQueue*& HQ) { if(HQ.front==NULL){ //若链队已空则终止程序运行 cerr<<“Linked Queue is empty!”<<endl; exit(1); } ElemType temp=HQ.front->data;
如下图所示为经过刚才多次入队出队操作后队列的状态: 0 1 2 3 4 5 6 7 8 (QueueMaxSize-1) e f g h i j d k l ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ front front front front front front front front front rear rear rear rear j入队 因为j入队前rear已经指向最后一个位置,因此新插入的元 素应插入下标为0的位置
--链式队列 队列的链接存储结构--链式队列 通过由结点构成的单链表实现,此时只允许在单链表的表头进 行删除和在单链表的表尾进行插入 队首指针(front) 队尾指针(rear) :指向队首(即表头)结点的存储位置 :指向队尾(即表尾)结点的存储位置
---队列的操作在链接存储结构上的实现 4.4 队列---队列的操作在链接存储结构上的实现
:双目运算符出现在两个操作数后面,这种表达式叫做后 缀算术表达式或后缀表达式,这种表式又称做逆波兰式 逆波兰式
特点:无括号,无优先级差别 运算规则:由前向后,按运算符出现的先后次序进行运算; 例1:3 5 / 6 + =0.6+6=6.6 例2:2 5 6 * + =2 30 +=32
4.2 算术表达式的计算
/ (1 - x) /
* 1 x
例4:(25+x)*(a*(a+b)+b)
(25 + x) * (a * (a + b) + b) 25 x + a a b + * b + *
4.2 算术表达式的计算
后缀表达式求值的算法
约定一个后缀表达式以字符‘@’作为结束符 后缀表达式求值的基本思路: (1) 每次读入后缀算术表达式的一个字符(运算符)或一个数值(操 作数)(以空格作为数据之间的分隔符) (2) 判断读入的字符: 如果是数值:则说明它读入的一定是操作数,并把它压入栈中 如果是运算符:则表明它的两个操作数都已经在栈中,则从栈 中依次弹出两个操作数(栈顶元素为第二操作数,栈顶下一个 元素为第一操作数),做相应运算,运算结果压入栈中 例:3 / 5 + 6 3 5 / 6 + @ =6.6 读入3 读入/ 读入6 读入+ 读入@ 读入5 5和3出栈,做“/”法:3/5=0.6;结果入 栈 5 6 5 / 3 = 0.6 6 + 0.6 = 6.6
0.6 6.6 3 6和0.6出栈,做“+”法:6+0.6=6.6;结果入 栈 结束,栈中还剩一个元素,弹出栈空,即为运算结果
本节完
--队列的定义 4.3 队列--队列的定义
队列(Queue)简称队,它也是一种运算受限的线性表
其限制是仅允许在表的一端插入,而在表的另一端进行删除。 队尾 队首 :队列中进行插入 插入的一端 插入 :队列中进行删除 删除的一端 删除
栈的顺序存储结构(参见 栈的顺序存储结构(参见P72) )
注:top=-1 top=top=maxSizetop=maxSize-1
(1) (2) (3) (4) (5)
表示栈空 表示栈满
3 2 24 ←top 1 48 ←top 0 35 ←top
(6) x=a.GetTop(); Stack a; (7) a.Pop(); a.Push(35); int x=48; a.Push(x); (8) a.IsEmpty(); (9) cout<<a.Pop()<<endl; a.Push(x/2); (10) x=a.IsEmpty(); x=a.Pop();
//暂存队首元素 //暂存队首指针以便回收空间
LNode *p=HQ.front; HQ.front=p->next; //使队首指针指向下一个结点
}
if(HQ.front==NULL) //若链队变空,则需同时使队尾指针变为空 HQ.rear=NULL; //回收原队首结点 delete p; 时间复杂度为 return temp; //返回被删除的队首元素值 O(1)
进队(入队) 进队(入队) :向队列中插入新元素 出队(离队) 出队(离队) :从队列中删除元素 由于队列的插入和删除操作分别是在各自的一端进行的,每个元素必然按进入 的次序离队,所以又把队列称为先进先出表(First In First Out,简称FIFO) 例:已知队列Q(a,b,c),其中a为队首元素,c为队尾元素 若从此队列中删除一个元素,则a出队,b为新的队首元 素,Q变为(b,c) 若将元素e入队,则e成为新的队尾元素,Q变为(b,c,e)
4.2 算术表达式的计算
算术表达式的两种表示
注:这里仅以双目运算符“+、-、*、/”为例
(1) 中缀表示
:双目运算符出现在两个操作数中间,这种表过式叫 做中缀算术表达式或中缀表达式
运算规则:先算括号内,再算括号外; 先乘除后加减; 同级运算从左到右; 这种表达式就是我们通常所习惯的运算表达式
(2) 后缀表示
4.1 栈---栈的定义
栈(Stack)又Biblioteka Baidu堆栈,它是一种运算受限的线性表 其限制是仅允许在表的一端插入和删除,这一端叫做栈顶 栈顶。
另一端叫做栈底 栈底。 栈底
栈顶元素 :栈顶的第一个元素 进栈(入栈) 进栈(入栈) :向一个栈插入新元素,使之成为新栈顶元素 出栈(退栈) 出栈(退栈) :从一个栈中删除栈顶元素 由于栈的插入和删除操作都是在同一端(栈顶)进行的,后进栈的元素必定先 出栈,所以又把栈称为后进先出表(Last In First Out,简称LIFO) 例:已知栈S(a,b,c),其中c的一端为栈顶 则:栈顶元素是c 若向S压入一个元素d,则S变为(a,b,c,d) 若从栈S中依次删除两个元素,则每一次删除的元素为d 栈S变为(a,b,c),第二次删除的元素是c,栈S变为(a,b)
在具体的语句实现上,不是简单的rear+1就可以完成的, 为此我们用rear=(rear+1)%QueueMaxsize语句来实现队尾 指针后移一位 k入队 l入队 队满 此时(rear+1)%QueueMaxSize==front d出队 e出队 f出队 g出队 h出队 i出队 j出队 k出队 l出队 队空 此时(rear+1)%QueueMaxSize==front 由此可见,队空和队满时,rear和front所满足的条件是一样的
本节完
队列的顺序存储结构(见P85) 队列的顺序存储结构( )
class Queue{ Type elements //存放队列中元素的数组 //存储队首和队尾指针 int front,rear; //存储队列最大长度 Int maxSize; }
如下图所示为某队列的状态: 0 1 2 3 4 5 6 7 8 b a e f g i h c d ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ front front front front rear rear rear rear rear rear rear d入队 e入队 a出队 b出队 c出队 f入队 g入队 h入队 i入队 队列满 由此可见,存储队列的数组还有空闲位置,但已经不能插入元素了 为此,我们约定,当队尾指针指向数组空间的最后一个位置(QueueMaxSize-1) 时,如果数组前面尚有空闲位置,表明队列未满,则下一个存储位置应是下标 为0的位置
←top top=-1 top=0 top=1 top=2 x=24 x=48 x=1 返回false 返回true 输出35
栈的链接存储结构
与线性表的链接存储结构相同,通过由结点构成的单链表实现的 此时:表头指针称为栈顶指针 栈顶指针 由栈顶指针指向的表头结点称为栈顶结点 栈顶结点 这时对栈的操作实际上就是对单链表的操作,只不 过所有的操作(插入、删除…)都是集中在表头
循环队列
为了区分队列空与队列满,我们提出了循环队列的思想:让front指针 指向队首元素的前一个位置。如下为某一时刻队列的状态:
0 1 2 3
C E F G B A ↑↑ ↑↑ ↑↑ ↑↑ front front front front rear rear rear rear B入队 C入队 队满 此时(rear+1)%QueueMaxSize==front A出队 B出队 C出队 队空 此时rear==front E入队 F入队 G入队 队满 此时(rear+1)%QueueMaxSize==front E出队 F出队 G出队 队空 此时rear==front
把中缀表达式转换为后缀表达式
规则是:将所有的操作符移到相应两个操作数之后, 去掉所有的括号 例1:3/5+6 3 / 3 5 例2:16-9*(4+3) 5 + / 6 6 +
16 - 9 * (4 + 3) 16 9 4 3 + * -
例3:2*(x+y)/(1-x)
2 * (x + y) 2 x y +
相关文档
最新文档