首页 > 编程知识 正文

出入栈及出入队列,两个栈实现一个队列python

时间:2023-05-04 12:23:41 阅读:26852 作者:4996

在解决问题之前,让我们回顾一下“堆栈和队列的共同点和不同点”。 解决问题时的应用变得容易。

1 .区别和联系

同一点(1)堆栈和队列都是控制接入点的线性表;

)2)堆栈和队列都是允许在端点插入和删除数据的数据结构;

不同点)1)堆栈遵循“后进先出(LIFO )”原则。 即,只能在该线性表的一端插入和删除数据,将该位置称为“堆栈顶”,将另一端称为“堆栈底”。 根据该特性,在实现堆栈时可以使用顺序表;

)2)队列遵循“先进先出(FIFO )”原则。 即,只在队列的末尾插入要素,开头删除要素。 根据该特性,在实现矩阵时可以使用链表

2 .应用场景

堆栈:括号匹配; 用于计算后缀的公式、等数据结构

队列:当我们在Linux上学习进程间通信时,一种通信方式适用于现实生活中的队列问题,如“消息队列”。

让我们来看看问题:

一.在两个堆栈上实现队列

看这个问题,就要考虑堆栈和队列的区别。 在两个堆栈中实现一个队列是指实现队列的“末尾插入”和“开头删除”操作。

首先,假设要插入一些数据“abcd”。 我们知道,按此顺序在队列中显示的结果也是" abcd ",堆栈上显示为" dcba "。 相反,如果将堆栈的到达数据插入到另一个堆栈中,则会显示所需的结果。 因此,将两个堆栈定义为堆栈1和堆栈2。 堆栈1仅用于插入数据,堆栈2用于删除数据堆栈1插入的数据。

在下图中,我们将分析此模拟的场景

图(1)将队列中的元素“abcd”推入堆栈1。 在这种情况下,堆栈2为空;

图)2) :将堆栈1的要素pop放入堆栈2中。 此时,如果pop堆栈2的要素,则顺序与队列删除数据相同;

图(3)可能有人会怀疑,如图3所示,当堆栈2只pop一个元素a时,satck1中可能还会插入元素e。 此时,如果将堆栈1的元素e插入堆栈2中,则堆栈在a之后的元素为e。 很明显,这么想是错误的。 必须规定堆栈2的要素pop

代码实现如下:

模板命名队列{公共: c队列(void ); ~ c队列(语音); 连续节点; T deleteHead (; 隐私:堆栈1; 堆栈2; (; templatetypenametvoidcqueuet :3360 append tail (const telement ) /尾插(stack1.push ) element ); } templatetypenametcqueuet :3360 delete head ((if ) stack2.size )=0) while ) stack1.size0) tdata=stack1. pstack 1。 stack2. push (数据; } } t head=堆叠2.top (; stack2.pop (; if (堆栈2.size (==0)堆栈2为空时,异常的throw new exception (' queue isempty ); 返回头; (二、在两个队列中实现一个堆栈

由于堆栈的性质是“后进先出”,因此在两个队列模拟中实现堆栈时,两个队列的元素必须“相互盖章”,实现堆栈的这一特性

具体做法,还是在图上看看吧

图(1) )在堆栈中插入元素“abcd”时,元素a位于堆栈底部(最后退出),d位于堆栈上方) (首先退出)。

图(2)元素) abc )从q1中头去除,q2中尾插入后,q1中的元素) d )从头去除,相当于实现了栈顶元素的外栈。

照片(3)同样,从q2的开头删除元素“ab”,在q1中插入末尾,从开头删除q2的元素“c”。

图(4)同样,删去要素" b ";

照片(5)如果在堆栈中插入另一个元素“e”,则无法从队列中删除元素“a”。 而是将元素“a”插入q2,删除q1中的元素“e”,最后删除元素“a”。

说明:其中红色框表示队列中的元素退出队列。 队列是空的。

代码实现如下:

模板命名堆栈{公共: c堆栈(void ); ~ c堆栈(语音); 连续节点; T deleteHead (; 隐私:队列Q1; queueT q2; (; templatetypenametvoidcstackt :3360 append tail (const tnode ) /提供堆栈元素插入(//数据插入原则)。 将一个队列保留为空,不清空一个队列,非空队列包含元素if (! q1.empty () ) Q1.push ) ) node; (else ) Q2.push ) )节点; } templatetypenamettcstackt :3360 delete head (/删除实现堆栈元素({int ret=0; if (! q1.empty () ) {int num=q1.size; while(num1) Q2.push ) Q1.front ); q1.pop (; --num; (}ret=q1.front ); q1.pop (; }else{int num=q2.size (; while(num1) Q1.push ) Q2.front ); q2.pop (; --num; (}ret=q2.front ); q2.pop (; }返回ret; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。