首页 > 编程知识 正文

什么时候用栈什么时候用队列,简述如何用两个栈实现一个队列

时间:2023-05-06 16:34:56 阅读:26848 作者:2372

以前,我们了解了一些堆栈和队列存储结构,实现了堆栈和队列操作,例如,堆栈(入队)、出队(出队)等。 但是今天我们要讨论一个经典问题:用两个堆栈实现一个队列,用两个队列实现一个堆栈。

要实现这一结构,必须了解堆栈和队列的存储结构及其各自的特性以解决问题。

我已经写了堆栈和队列实现,但今天我将直接使用STL库中的堆栈和队列。

一、两个堆栈实现一个队列首先,我们知道堆栈的特性是先进先出,队列的特性是先进先出。 那么,在需要实现一个队列的时候,那是先进先出的原则,我们插入的数据放入堆栈中,想要得到许可的是堆栈中最下面的要素。 这样,就需要对堆栈中的所有元素进行堆栈操作。 我们利用另一个堆栈来存储这些堆栈的元素,然后我们在这个新堆栈上执行堆栈操作,正好与我们进入堆栈时出现堆栈元素的顺序相反,所以这正好是我们想要实现的队列的先进先出

定义堆栈1和堆栈2两个。 进行排队操作时,首先要像堆栈1那样放入数据。 那么,如何进行满判定操作呢? 当一个堆栈已满时,只能进入另一个堆栈。 这样进行堆栈操作的话,会出现先进先出的原则,无法保证。 因此,堆栈1是

由于系统实现的堆栈不需要进行判定装满的操作,所以只需要注意判定空的操作即可,如果两个堆栈都为空,则队列为空。

执行类似队列的操作时,首先将其存储在堆栈1中。 如果需要堆栈操作,则根据堆栈的实现方法会得出数字9,但对于队列应该会得出数字1。 因此,向堆栈stack1中提取所有元素并进行堆栈,然后堆栈到堆栈stack2中。

以后进行堆栈操作时,可以直接在堆栈2中进行堆栈操作。 也就是说,退出队列的操作。

那么,我们的一些操作该怎么实现呢

入队(推式)入队只需要将数据放入堆栈1中;

出队(pop ) :

判断堆栈stack2是否为空,如果不为空则直接发出堆栈stack2;

如果堆栈stack2为空,堆栈stack1不为空,则堆栈堆栈stack1中的所有数据,堆栈到堆栈stack2,堆栈到堆栈stack2;

如果堆栈stack2和stack1均为空,则直接返回-1;

实现代码如下:

# include iostream # includestackusingnamespacestd; templatetypenametclassqueue { public : queue (} { }~queue ) { } void push (tval ) } { stack1. push (val ) }; }T Pop () {T tmp=-1; if (! stack2.empty () {tmp=stack2.top ); stack2.pop (; (else ) if (! stack1.empty () ) {while (! 堆叠1.empty () (堆叠2.push )堆叠1.top ) ); stack1.pop (; }tmp=stack2.top (; stack2.pop (; } }返回tmp; } private :堆栈1; 堆栈2; (; 第二,两个队列实现一个堆栈两个队列实现一个堆栈也利用了我们堆栈和队列的特性。 堆栈进行堆栈操作时,进行先进先出。 那么,我们将进入队列的数据从队列中取出是先进先出的原则。 因此,我们利用一个新队列,进行除了提取堆栈的元素以外的其他数据元素从队列中提取、在新队列中提取、在原队列中提取的操作就是从堆栈中提取的操作

这是我们的两个队列,当我们进入堆栈时,将所有数据放入队列queue1。 和堆栈一样,我们使用STL库中的队列,所以不需要完全判定操作。

如果需要堆栈,请对除queue1队列中的最后一个元素以外的所有元素进行排队,在队列queue2中进行排队,然后对queue1的其馀数据元素进行排队。 这是需要堆栈的要素。 然后,将queue2的所有元素排队操作,并将其全部放入queu1。

将堆栈(推)数据元素直接排队到queue1;

堆栈(pop ) :

如果队列queue1不为空,则对队列queue1中除最后一个元素之外的其他元素进行排队,对队列queue1中的数据进行排队,对队列queue2中的所有数据进行排队,然后对其进行排队;

如果队列queue1位为空,则返回-1;

实现代码如下:

# include iostream # includequeusingnamespacestd; templatetypenametclassstack { public :堆栈(} { } ~堆栈) { } void push (tval ) } { queue1. push (val ) }; }T Pop () {T tmp=-1; if (! queue1.empty () while ) queue1.size ) )1) ) queue2.push ) queue1.front ) ); queue1.pop (; }tmp=queue1.front (; queue1.pop (; while(queue2.size(0) ) queue1. push (queue2. front ) ); queue2.pop (; } }返回tmp; }隐私:队列队列1; 队列队列2; (;

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