Java仅用队列结构实现栈结构和仅用栈结构实现队列结构

问题:

1、如何仅用队列结构实现栈结构?
2、如何仅用栈结构实现队列结构?


解答:

1、使用两个队列结构Queue1和Queue2 ,push操作一样,添加push()到Queue1,pop()核心是把 Queue1 除最后添加的元素"剪切"到 Queue2 ,最后poll()剩下的第一个元素,即为最后添加的元素,最后 再交换Queue1和Queue2和引用。

代码实现:

package cn.itcats.array;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 如何仅用队列结构实现栈结构?
 * @author fatah
 */
public class QueueToStack {
	private Queue<Integer> data;
	private Queue<Integer> help;
	
	public QueueToStack() {
		this.data = new LinkedList<Integer>();
		this.help = new LinkedList<Integer>();
	}
	
	//正常push添加进入Queue
	public void push(int value) {
		data.add(value);
	}
	
	//当在pop的时候,pop只留下一个元素,并把pop出来的元素加入到help队列中
	public int pop() {
		if(data.isEmpty()) {
			throw new RuntimeException("栈为空");
		}
		while(data.size() > 1) {
			//把data中的元素"剪切"到help队列,直到data只剩下一个元素
			help.add(data.poll());
		}
		//最后一个入队的元素
		int res = data.poll();
		//swap()交换help和data的引用指向
		swap();
		return res; 
	}
	
	public int peek() {
		if(data.isEmpty()) {
			throw new RuntimeException("栈为空");
		}
		while(data.size()>1) {
			help.add(data.poll());
		}
		int res = data.poll();
		help.add(res);
		swap();
		return res;
	}
	
	public void swap (){
		Queue<Integer> temp = help ;
		help = data ;
		data = temp ;
	}
}

2、使用栈结构实现队列结构

思路:

//准备popStack和pushStack
public void stackToQueue(){
    if(!popStack.isEmpty){
        return ;
    }
    while(!pushStack.isEmpty){
        popStack.push(pushStack.pop);
    }
}

 注意【重要!!!】

这种方式需要满足两个原则

1、push栈的数据要一次全部"倒"入pop栈

2、当"倒"数据的时候,对向栈不能含有数据,否则会乱套。

猜你喜欢

转载自blog.csdn.net/itcats_cn/article/details/81434402
今日推荐