首页 生活常识 正文

如何用两个栈实现一个队列(如何使用两个栈实现一个队列)

以及如何使用两个栈实现一个队列对应的知识点,1、怎样用2个栈实现队列(java)2、C数据结构中如何用两个栈实现一个队列3、利用两个栈sl、s2模拟一个队列时,如何用栈的运算实现队列的插入、删除以及判队空运算4、如何用两个堆栈模拟实现一个队列5、怎样用两个栈实现一个队列的功能怎样用2个栈实现队列(java)队列的要求是先进先出,1)....

本篇文章给大家谈谈如何用两个栈实现一个队列,以及如何使用两个栈实现一个队列对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录:

怎样用2个栈实现队列(java)

队列的要求是先进先出,用两个栈可以很容易的实现

假设其中一个栈为s1, 另一个为s2

1. 入队:将元素放入s1中,s2始终为空

2. 出队:

1). 首先将s1中的元素全部导入s2的栈中,清空s1,

2). 然后再将s2栈顶元素出栈,保留下来,

3). 将s2剩余元素导入s1中,恢复数据原有顺序,就可以了

至于代码,自己想想就能写出来

C数据结构中如何用两个栈实现一个队列

照着这个思路做:

假设两个栈 A 和B,且都为空。

可以认为栈 A 为提供入队列的功能,栈 B 提供出队列的功能。

入队列: 入栈 A

出队列:

1 如果栈B 不为空,直接弹出栈 B 的数据。

2 如果栈 B 为空,则依次弹出栈 A 的数据,放入栈 B 中,再弹出栈 B 的数据。

StatckOne.java

import java.util.ArrayList;

public class StatckOne {

private static ArrayList al;

public StatckOne() {

if (al == null)

al = new ArrayList();

}

public void put(Object o) {

al.add(o);

}

public Object top() {

int size = al.size();

if (al != null) {

if (size != 0) {

System.out.println("StatckOne");

return al.get(size 1);

} else

System.out.println("栈中没有对象");

} else

System.out.println("没有初始化");

System.out.println("StatckOne");

return null;

}

}

StatckTwo.java

import java.util.ArrayList;

public class StatckTwo {

private static ArrayList al;

public StatckTwo() {

al = new ArrayList();

}

public void put(Object o) {

if (al != null)

al.add(o);

else

System.out.println("没有初始化");

}

public Object top() {

int size = al.size();

if (al != null) {

if (size != 0) {

System.out.println("StatckTwo");

return al.get(size 1);

} else {

StatckOne so = new StatckOne();

return so.top();

}

} else

System.out.println("没有初始化");

return null;

}

}

利用两个栈sl、s2模拟一个队列时,如何用栈的运算实现队列的插入、删除以及判队空运算

使用两个栈,分别依元素加入的顺序和其反序保存元素,在适当的时机将元素在两个栈中进行转移,从而模拟队列的操作。

令S1中元素的顺序为自底向上与元素添加顺序一致,S2与其相反,则:加入队列时,若S2不空,则将S2中的元素依次出栈,每出栈一个向S1中入栈一个;将入队元素入S1栈;

从队列中取出时,若S1不空,则将S1中元素依次出栈,每出栈一个向S2中入栈一个;从S2栈顶出栈一个即队列中取出的元素。

扩展资料:

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。

栈是允许在同一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈顶(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH),删除则称为退栈(POP)。栈也称为先进后出表。

参考资料来源:百度百科-栈

如何用两个堆栈模拟实现一个队列

栈的结构是先进后出,队列的结构是先进先出,那么用两个栈模拟一个队列的思路就是一个栈用来入列,另一个栈用来出列。

看图说话:

下面我们采用一个例子来推导结论,继续看图说话:

1)入列:依次往stack1中插入a、b、c

2)出列:若stack2为空的话,那么stack1中元素依次出栈,压入stack2中,此时stack2中的元素从栈顶往栈底方向依次是a、b、c,然后依次弹出元素a和b

3)入列:往stack1中插入d元素

4)出列:此时stack2中依然有元素c,那么c比d先入列,则c应该比d先出列,所以此时出列元素为c

5)出列:此时stack2中没有元素,那么stack1中有元素d出栈压入stack2,stack2中的元素d弹出(即出列)。

由以上例子我们可以得出以下结论:

以stack1为入列栈,入列的元素插入stack1中,以stack2为出列栈,出列时做以下判断

a 若stack2为空,那么将stack1中的数据出栈压入stack2

b 再判断stack2是否为空,若不为空,那么stack2中元素弹出(出列),若为空则提示队列为空

下面仅给出关键代码

代码如下:

public class CQueue {

private StackM stack1,stack2;

public CQueue(){

stack1 = new StackM(10);

stack2 = new StackM(10);

}

//元素入列

public void appendTail(long elem){

if(stack1.isFull()){

System.out.println("已经满栈了");

}else{

stack1.push(elem);

System.out.println(elem+"入列了");

}

}

//元素出列

public long deletedHead(){

//若stack2为空,则stack1中元素弹出压入stack2中

if(stack2.isEmpty()){

while(!stack1.isEmpty()){

long elem = stack1.pop();

System.out.println(elem+"入Stack2");

stack2.push(elem);

}

}

//执行完以上操作后,stack2依然为空则返回-1代表空栈

if(stack2.isEmpty()){

return -1;

}else{

return stack2.pop();

}

}

public boolean isQueueEmpty(){

return stack2.isEmpty()stack1.isEmpty();

}

}

/**

* 定义了一个顺序存储结构栈

* @author szh1840836

*

*/  

public class StackM {

private int maxSize;        //栈的最大值

private long[] stackArray;  //栈的元素数组

private int top;            //栈顶

public StackM(int maxSize){

this.maxSize = maxSize;

stackArray = new long[maxSize];

top = -1;  //目前为空栈

}

//入栈

public void push(long elem){

stackArray[++top] = elem;

}

//出栈

public long pop(){

return stackArray[top--];

}

//是否空栈

public boolean isEmpty(){

return top==-1;

}

//获取栈顶元素

public long getTop(){

return stackArray[top];

}

//是否满栈

public boolean isFull(){

return top == maxSize-1;

}

}

怎样用两个栈实现一个队列的功能

举例说明,假设我们进行以下4步:

push 1, 2

pop //此时应pop 1

push 3

pop //此时应pop 2

在运行第一个pop时,把A中的1,2全push到B中去,然后再pop得到1,此时B中还剩一个2

下一步push 3,是push到A中

最后一步pop,把B中的2给pop出去

关键点:

(2)如果不为空,则将栈A中所有元素依次pop出并push到栈B;

这里隐含了一点,如果为空,就直接从B中pop,不对A进行任何操作。很显然,需要if..else语句。

弹栈和一般的出栈不同,需要多一部检测B是否为空。

如果B不为空,则直接从B出栈,这时与一般的出栈相同。

如果B为空,则需要把A中所有的元素出栈并压栈到B中去,然后再对B进行一般的出栈操作。

如何用两个栈实现一个队列的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于如何使用两个栈实现一个队列、如何用两个栈实现一个队列的信息别忘了在本站进行查找喔。

本文转载自互联网,如有侵权,联系删除