我们在上期学了队列的相关知识,所以我们得实际应用。那栈和队列是否可以相互实现呢?那必然是可以的。接下来我们就实际操作一下吧!
栈实现队列
我们是通过栈来实现队列的,所以我们定义一个类QueueImplByStack;并且实现队列的接口。因为我们宏观来看还是在操作队列。我们的思想就是使用两个栈来实现一个队列的进行的操作。一个是主栈,一个是暂存元素的栈。比如出队操作,我们可以先把主栈内的元素仅仅只留栈底元素,其余全部弹栈到暂存栈里面,留下的元素直接弹出则就是队首元素出队操作,然后在把暂存栈里面的元素弹栈进入到主栈中,现在的顺序就是和之间的顺序是一样的了。其余的操作的思想和出队的思想是一样的。那类里面应该定义两个ArrayStack修饰的栈A与栈B。在写一个无参构造函数默认创建两个栈。
private ArrayStack<E> stack1;
private ArrayStack<E> stack2;
public QueueImplByStack(){
stack1 = new ArrayStack<>();
stack2 = new ArrayStack<>();
}
接下来就写我们的队列操作,操作都是和我们上期学的队列操作一样。乃我们就来写一下吧。
首先是入队操作,队列的入队操作就是从队尾进行入队,和栈思想是一样的,是从栈顶进元素。
出队操作是先进行判空。然后判断栈内有效元素个数是否为一,我们出队的是队首元素就相当于栈底元素,所以得要先不断弹出栈顶元素到stack2,然后在把stack1栈顶弹出即是队首元素出队。最后不要忘了把stack2进行弹栈在入栈到stack1里面。
在查看队首元素的时候思路和删除队首元素的思路是一样的,只是在stack1最后一个元素我们不进行弹栈而是记录起来,最后在返回就是队首元素。
判空操作,清空队列,求队列有效元素个数则都是判断stack1是否为空,清空stack1,求stack1里有效元素个数。
队列迭代器函数就直接调用stack1的迭代器就可以。队列的toString函数也直接调用stack1的toString函数即可。大致思路就是这样,我们直接上代码也包括了我们的测试类。
完整代码
package p2.线性结构;
import p1.接口.Queue;
import jav