本篇文章给大家谈谈如何用两个栈实现一个队列,以及如何使用两个栈实现一个队列对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录:
- 1、怎样用2个栈实现队列(java)
- 2、C数据结构中如何用两个栈实现一个队列
- 3、利用两个栈sl、s2模拟一个队列时,如何用栈的运算实现队列的插入、删除以及判队空运算
- 4、如何用两个堆栈模拟实现一个队列
- 5、怎样用两个栈实现一个队列的功能
怎样用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进行一般的出栈操作。
如何用两个栈实现一个队列的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于如何使用两个栈实现一个队列、如何用两个栈实现一个队列的信息别忘了在本站进行查找喔。