两个堆栈实现一个队列和一叠两个队列实现【算法导论课后题】

两个栈实现队列两个队列实现堆栈问题,网上有很多资料。这里仅仅是叙述操作方法的介绍觉得至少。

两个栈实现一个队列

思想:假设两个栈分别为s1,s2。对s1进行入队,出队时,先推断s2是否为空,假设是则将s1中元素压入s2并弹出最上面元素,假设不是,则直接弹出s2最上面的元素。

<span style="font-size:18px;">EnQueue(s1,s2,k){
push(s1,k)</span><span style="font-family:Arial, Helvetica, sans-serif;"><span style="font-size: 18px;">;</span></span><span style="font-size:18px;">
}
//出队
DeQueue(s1,s2){
if( IsEmptyStack(s2)){
while(sizeofStack(s1) !=0){
push(s2,pop(s1));
}
}
if(IsEmptyStack(s2)){
printf("stack overflow");
}
return pop(s2);
}</span>

两个队列实现一个栈

思想:一个队列用来入栈q1。还有一个作为中转站q2。对不为空的队列进行入栈和出栈操作,入栈时直接入队就可以。出栈时,先将队列中n-1个元素压入中转站,最后一个元素出队

<span style="font-size:18px;">push(q1,q2,k){
if(IsEmptyQueue(q1)){
EnQueue(q2,k);
}
else{
EnQueue(q1,k);
}
}</span>

出栈时须要两个暂时指针pushtmp和tmp作为入栈和中转站(该方法消耗空间)

<span style="font-size:18px;">pop(q1,q2){
Queue pushtmp,tmp;
if(IsEmptyQueue(q1)){
pushtmp=q2;
tmp=q1;
}
else{
pushtmp=q1;
tmp=q2;
}
if(IsEmptyQueue(pushtmp)){
printf("OverFlow");
}
else{
while(sizeof(pushtmp) !=1)
DeQueue(tmp,DeQueue(pushtmp));
}
return Dequeue(pushtmp);
}</span>

版权声明:本文博客原创文章。博客,未经同意,不得转载。

时间: 2024-12-26 10:30:56

两个堆栈实现一个队列和一叠两个队列实现【算法导论课后题】的相关文章

两个栈实现一个队列和两个队列实现一个栈【算法导论课后题】

关于两个栈实现一个队列和两个队列实现一个栈问题,网上有很多资料.这里只描述自己认为操作最少的方法. 两个栈实现一个队列 思想:假设两个栈分别为s1,s2.对s1进行入队,出队时,先判断s2是否为空,如果是则将s1中元素压入s2并弹出最上面元素,如果不是,则直接弹出s2最上面的元素. <span style="font-size:18px;">EnQueue(s1,s2,k){ push(s1,k)</span><span style="font-

使用两个栈实现一个队列

使用两个栈Stack1和Stack2来实现一个队列.其中一个栈作为主存放数据的,另外一个栈作为临时存放数据的栈.具体操作如下: enqueue: 栈Stack1的入栈操作. dequeue:将Stack1中的元素一个一个地全部依次出栈,并且在Stack1出栈的同时把出栈的元素作为参数对Stack2进行入栈操作.这步完成之后,执行Stack2出栈操作,这时就将原先在Stack1中最先入栈的元素弹出.最后再将Stack2中的元素一个一个地全部依次出栈,填到Stack1中. 实现代码如下: /** *

用两个栈实现一个队列

用两个栈实现一个队列的功能 解析: 假设两个栈A和B,且都为空. 可以认为栈A提供入队列的功能,栈B提供出队列的功能. 入队列:入栈A. 出队列: 如果栈B不为空,直接弹出栈B的数据. 如果栈B为空,则依次弹出栈A的数据,放入栈B中,再弹出栈B的数据. 代码如下: #include<iostream> #include<stack> using namespace std; template<class T> struct MyQueue { void push(T &

包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈

1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈  3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就不入栈当前的辅助栈:当出栈时,辅助栈元素相等时也要出栈. class Solution { public: stack<int> mystack1;//辅助栈 stack<int> minstack;//最小栈 void push(int value) { if(

两个栈实现一个队列

问题描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解法分析: 首先题目要求用两个栈实现一个队列,那么就要先分析为什么这么做.队列的特点就像排队的"先到先得"一样,即先入队的就先出队:而栈则正好相反,特点是"后进先出",那么问题来了怎么用"后进先出"的得到"先进先出"? 传说中最简单通用但效率不高的方法(其实我还真没想到这么做)是,入队的时候用stack1来存储,当出队的时候,先把

web前端面试系列 - 数据结构(两个栈模拟一个队列)

一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将剩余数据弹出s2,并压人s1. 思路二: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时,判断s1, 是否为空,如果不为空,则将数据直接压入s1, 如果为空,则将s2中的数据全部倒入s1,在将数据压人s1. 3. 出队时,判断s2, 是否为空,如果不为空,则直接弹出s2

两个栈实现一个队列,两个队列实现一个栈

1.两个栈实现一个队列 有三种思路: 思路一:将stack1作为存储空间,将stack2作为临时缓冲区,入队时,直接压入stac1,出队时,将stack1中的元素依次出栈压入stack2中,再将stack2的栈顶元素弹出,最后将stack2中的元素再倒回给stack1 思路二:入队时,判断stack1是否为空,如果stack1为空,则将stack2中的所有元素都倒入stack1中,再将元素直接压入stack1,否则,直接压入stack1中 出队时,判断stack2是否为空,如果stack2为空,

用两个stack设计一个队列

思路:用两个栈,一个用于接收(in),一个用于输出(out),输出前如果out为空需要将in中的数据导入out. import java.util.Stack; //用两个stack设计一个队列 p142 public class MyQueue<T> { Stack<T> in; Stack<T> out; public MyQueue() { in = new Stack<T>(); out = new Stack<T>(); } publi

一个数组构造两个堆栈

***用一个数组表示两个堆栈,最大限度的利用空间 0 1 2 3 若果像右图中从中间分成两部分,则可能存在其中一个堆栈满了,而另一个堆栈还有空的,为你最大限度的利用空间,需要两边像中间长,知道指针碰头表示堆栈已满 #include<iostream>using namespace std;#define Maxsize 100class stack{public: int a[Maxsize]; int top1; int top2;};void push(stack&A, int x