1.用栈实现队列
栈是先入后出,队列是先入先出。根据这个思想,可以用一个栈作为入队,另一个栈作为出队。只要把第一个栈的栈顶的元素压入第二个栈就好了,出队的时候输出第二个栈的栈顶,如果第二个栈的空了就需要不断操作从第一个栈的栈顶压入第二个栈,但是如果第一个栈也空了,那就说明所有元素都输出来了
public class StackQueue {
/**
* 栈是先入后出,队列是先入先出。根据这个思想,可以用一个栈作为入队,另一个栈作为出队。只要把第一个栈的栈顶的元素压入第二个栈就好了,
* 出队的时候输出第二个栈的栈顶,如果第二个栈的空了就需要不断操作从第一个栈的栈顶压入第二个栈,但是如果第一个栈也空了,
* 那就说明所有元素都输出来了
*/
// 作为入队序列
private Stack<Integer> stack1 = new Stack<Integer>();
// 作为出队序列
private Stack<Integer> stack2 = new Stack<Integer>();
public void push(int node) {
// 入队时,要保证stack2为空
while (!stack2.empty()) {
stack1.push(stack2.peek());
stack2.pop();
}
stack1.push(node);
System.out.println("入队元素是:" + stack1.peek());
}
public int pop() {
// 出队时,要保证stack1为空
while (!stack1.empty()) {
stack2.push(stack1.peek());
stack1.pop();
}
System.out.println("出队元素是:" + stack2.peek());
int temp = stack2.peek();
stack2.pop();
return temp;
}
public static void main(String[] args) {
StackQueue so = new StackQueue();
so.push(1);
so.push(2);
so.push(3);
so.pop();
so.pop();
so.push(4);
so.pop();
so.push(5);
so.pop();
so.pop();
}
}
2.用队列实现栈
每入队一个元素,就将该元素之前的所有元素重新入队,使得第一个元素始终是栈top的元素
public class QueueStack {
public Queue<Integer> queue;
public QueueStack() {
queue = new LinkedList<>();
}
public void push(int x) {
queue.add(x);
int size = queue.size();
//每入队一个元素,就将该元素之前的所有元素重新入队,使得第一个元素始终是栈top的元素
while(size-- > 1){
queue.add(queue.poll());
}
System.out.println("入栈元素是:" + queue.peek());
}
public int pop() {
System.out.println("出栈元素是:" + queue.peek());
return queue.poll();
}
public int top() {
return queue.peek();
}
public boolean empty() {
return queue.size()==0;
}
public static void main(String[] args) {
QueueStack qs=new QueueStack();
qs.push(1);
qs.push(2);
qs.push(3);
qs.push(4);
qs.pop();
qs.pop();
qs.pop();
qs.pop();
}
}