栈实现队列(队列实现栈),java 编程规范 pdf 百度云
/** Get the top element.
查看栈顶元素但是不删除
方法:
1.如果栈为空,也就是两个队列都为空,那么就抛出空指针异常
2.如果不为空,那么需要将不为空的队列所有的元素出到为空的队列里面,但是每一次出队列的
数字都需要被临时记录下来,也就是定义一个临时的变量,把每一次出出来的值放在里面,知道出出来的数字时最后一个,
然后返回出来该临时变量就是我们所需要查看的值
@return
*/
public int top() {
if (empty()) {
throw new RuntimeException("空指针异常");
}
int e = 0;
if (!queue1.isEmpty()) {
for (int i = 0; i < this.UsedSize; i++) {
e = queue1.poll();
queue2.offer(e);
}
} else {
for (int i = 0; i < this.UsedSize; i++) {
e = queue2.poll();
queue1.offer(e);
}
}
return e;
}
/** Returns whether the stack is empty. */
public boolean empty() {
return this.UsedSize == 0;
}
}
<2>栈实现队列
和队列实现栈有着相同的思路,也需要申请两个栈来存放数据
入队:如果两个栈都是空的,第一次,那么我们规定入到 S1,每次都放到 S1
出队:从 S2 当中出,如果 S2 是空的,那么把 S1 当中的元素全部导入 S2 当中
如果 S2 不是空的,那么直接将 S2 的栈顶元素进行 pop();
代码实现
import
java.util.Stack;
/**
栈实现队列
方法:
1.当然也是需要两个栈
2.入队,如果两个栈都是空的,就把数字放在 S1,每次都放在 S1
2.出都从 S2 出
2.1.如果 S2 是空的,那么就把 S1 当中的元素全部导入到 S2 当中
2.2.如果 S2 不是空的,直接将 S2 的栈顶元素进行 pop()操作
*/
class MyStackQueue{
private Stack<Integer> stack1;
private Stack<Integer> stack2;
private int UsedSize;
public MyStackQueue(){
this.stack1 = new Stack<>();
this.stack2 = new Stack<>();
this.UsedSize = 0;
}
/** Push element x to the back of queue.
入队,如果两个栈都是空的,就把数字放在 S1,每次都放在 S1
*/
public void push(int x) {
stack1.push(x);
this.UsedSize++;
}
/** Removes the element from in front of queue and returns that element.
1 出都从 S2 出
1.1.如果 S2 是空的,那么就把 S1 当中的元素全部导入到 S2 当中
1.2.如果 S2 不是空的,直接将 S2 的栈顶元素进行 pop()操作
*/
public int pop() {
int e = 0;
if(stack2.empty()) {
while (!stack1.empty()){
stack2.push(stack1.pop());
}
}
if(!stack2.empty()){
e = stack2.pop();
}else {
System.out.println("队列为空");
}
return e;
}
/** Get the front element.
方法:
1.如果 S2 为空,s1 不为空,那么就将栈 S1 的数据利用栈的性值全部放在 S2,然后在返回 S2 的栈顶元素
2.如果 S2 不为空,那么就直接返回 S2 的栈顶元素
*/
public int peek() {
if(stack2.empty()){
while (!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
int e = 0;
if(!stack2.empty()){
e = stack2.peek();
}else {
System.out.println("队列为空");
}
return e;
}
/** Returns whether the queue is empty. */
评论