栈队列互相转换

两个 队列 实现 栈:

 

队列结构是先入先出,用两个队列结构,数组从队列1到队列2,元素顺序不会变。

栈结构是先入后出。即每次出栈的内容都是将队尾弹出,所以准备两个队列,

主队列 一个是加入数据的时候进入的队列(用来入栈)

辅队列 一个是弹出数据的时候(弹出队尾数据)所需队列。

弹出数据:将队列1 中的数据依次加入队列2,直到队列1中只剩一个数据为止。此时剩余的数据便是栈需要弹出的数据,将这个数据弹出即可)为了节省时间来回入队出队时间,此时将队列2改为主队列,数据中的元素位置并没有任何改变。

总结:push函数直接将数存入主队列即可,pop函数则需要将队列1中的数转移至队列2,弹出队尾,然后切换主辅队列。

代码:实现一个类,此类中有peek,pop,push函数

两个 栈 实现 队列:

栈push用来入数据,栈pop用来出数据.

push时,数据直接进入栈push。

出数据:先异常判断,两个栈都为空,抛出异常。当pop栈为空时,把栈1的数据倒入栈2,一次性倒完。不为空时,直接从pop中出数据(此时不可以向pop栈倒数据,否则会造成数据顺序混乱。)

注意:倒数据时,只有pop栈里已经没有数据时才可以把数据倒入pop栈内,并且在倒的过程中要把push栈的全部数据倒入

代码:实现一个类,此类中有peek,poll,push函数

package Queue;

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

//队列实现栈
public class Convert {
	public static class TwoQueueStack {
		Queue<Integer> queue;
		Queue<Integer> help;
		public TwoQueueStack() {
			queue = new LinkedList<Integer>();
			help = new LinkedList<Integer>();
		}
		//push
		public void push(Integer item) {
			queue.add(item);
		}
		//peek
		public Integer peek() {
			if (queue.isEmpty()) {
				throw new RuntimeException("Stack is empty!");
			}
			while (queue.size() > 1) {
				help.add(queue.poll());
			}
			Integer ans = queue.peek();
			help.add(queue.poll());
			swap();
			return ans;
		}
		//pop
		public Integer pop() {
			if (queue.isEmpty()) {
				throw new RuntimeException("Stack is empty!");
			}
			while (queue.size() > 1) {
				help.add(queue.poll());
			}
			Integer ans = queue.poll();
			swap();
			return ans;
		}
		//此函数不要加入参数传递,不然不会成功交换
		private void swap() {
			// TODO Auto-generated method stub
			Queue<Integer> t;
			t = queue;
			queue = help;
			help = t;
		}
	}

//栈实现队列
//不存在交换
	public static class TwoStackQueue{
		Stack <Integer> pushSt;
		Stack<Integer> popSt;
		TwoStackQueue(){
			pushSt=new Stack<Integer>();
			popSt=new Stack<Integer>();
		}
		public void push(Integer item) {
			pushSt.push(item);
		}
		public Integer peek() {
			//如果都为空,抛出异常
			if(pushSt.isEmpty()&&popSt.isEmpty()){
				throw new RuntimeException("the queue is empty");
			}else if(popSt.isEmpty()) {
				while(!pushSt.isEmpty()) {
					popSt.push(pushSt.pop());//倒数据
				}	
			}
			return popSt.peek();
		}
		public Integer poll() {
			//如果都为空,抛出异常
			if(pushSt.isEmpty()&&popSt.isEmpty()){
				throw new RuntimeException("the queue is empty");
			}else if(popSt.isEmpty()) {
				while(!pushSt.isEmpty()) {
					popSt.push(pushSt.pop());//倒数据
				}
			}
			return popSt.pop();
		}
	}
	public static void main(String[] args) {
		TwoQueueStack b = new TwoQueueStack();
		//TwoStackQueue b = new TwoStackQueue();
		b.push(6);
		b.push(3);
		System.out.println(b.pop());
		System.out.println(b.pop());
		b.push(5);
		b.push(4);
		b.push(9);
		b.push(11);
		System.out.println(b.pop());
		System.out.println(b.pop());
		System.out.println(b.peek());
		System.out.println(b.pop());
		b.push(2);
		b.push(1);
		System.out.println(b.pop());
		System.out.println(b.pop());
		System.out.println(b.peek());
		System.out.println(b.pop());
		//System.out.println(b.peek());
	}
}

 


版权声明:本文为qq_37290134原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。