17
2018
08

两个栈实现一个堆

问题描述:

用两个栈实现一个队列;用两个队列实现一个栈。

(堆,队列优先,先进先出。栈,先进后出)

https://www.cnblogs.com/tracyhan/p/5490775.html

用两个栈实现一个队列

思路:队列添加数据时,进入栈1;从队列取出元素时,如果栈2中有数据,直接从栈2出栈,如果栈2为空,先把栈1中的数据全部倒入到栈2,然后从栈2出栈。

类似于卖烧饼,一个栈相当于柜台,一个栈相当于笸箩,新出炉的烧饼先放到笸箩里,有人来买烧饼了,从柜台取,如果柜台的烧饼卖完了,就把笸箩里的烧饼全部倒到柜台里。

代码如下:

function Queue(){
	var stack1 = [];
	var stack2 = [];

	this.push = function(data){
		stack1.push(data);
	}

	this.pop = function(){
		if(stack2.length == 0){
			for(var i = stack1.length; i > 0; i--){
				stack2.push(stack1.pop());
			}
		}
		return stack2.pop();
	}
}

用两个队列实现一个栈

代码如下:

function Stack(){
	var queue1 = new Queue();
	var queue2 = new Queue();
	var n = 0;

	this.push = function(data){
		queue1.push(data);
		n++;
	}

	this.pop = function(){
		var size = queue1.size();
		for(var i = size - 1; i > 0; i--){
			queue2.push(queue1.pop());
			queue1.push(queue2.pop());
		}
		if(n > 0){
			n--;
		}
		return queue1.pop();
	}

	this.size = function(){
		return n;
	}
}

function Queue(){
	var stack1 = [];
	var stack2 = [];
	var n = 0;

	this.push = function(data){
		stack1.push(data);
		n++;
	}

	this.pop = function(){
		if(stack2.length == 0){
			for(var i = stack1.length; i > 0; i--){
				stack2.push(stack1.pop());
			}
		}
		if(n > 0){
			n--;
		}
		return stack2.pop();
	}

	this.size = function(){
		return n;
	}
}

https://github.com/hanyeah/lianxi/tree/master/两个栈实现一个堆

如果把上面代码中,Queue中的数组换成Stack会怎么样?



« 上一篇下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。