js:数组实现队列和栈、栈实现队列、队列实现栈

目录

 

一、利用数组结构实现大小固定的队列和栈

二、仅用队列结构实现栈结构

三、仅用栈结构实现队列结构

四、总结


一、利用数组结构实现大小固定的队列和栈

1.数组结构 实现 队列

  ①队列的特点:先进先出,后进后出。

  ② 注意:需要定义 start、end变量,以标记 出队和入队位置;还要定义一个size变量,约束出入队的行为。

<script type="text/javascript">
	// arrayToQueue
	var start = 0,end = 0,size = 0;
	function peek(arr){  // 返回队头元素
		if (size == 0) {
			console.log("This Queue is empty!");
			return;
		}
		console.log("队头元素:"+ arr[start]);
	}
	function push(arr,n){  // 入队操作
		if (size == arr.length-1 ) {
			console.log("This Queue is full!")
			return;
		}
		arr[end] = n;
		console.log(arr[end]+"入队列成功!")
		size++;
		end = end == arr.length-1 ? 0 : end+1;
		
	}
	function pop(arr){  // 出队操作
		if (size == 0) {
			console.log("This Queue is empty!")
			return;
		}
		console.log(arr[start]+"出队列成功!")
		size--;
		start = start == arr.length-1 ? 0 : start+1;
	}
	var arr = [];
	arr.length = 3;  // 设置队列长只有3
	push(arr,18)  // 18入队列成功!
	push(arr,3)  // 3入队列成功!
	pop(arr)  // 18出队列成功!
	pop(arr)  // 3出队列成功!
	pop(arr)  // This Queue is null!
	peek(arr)  // This Queue is null!
	push(arr,5)  // 5入队列成功!
	peek(arr)  // 栈顶元素:5
</script>

2.数组结构 实现 栈

  ① 栈的特点:先进后出,后进先出

  ② 需要一个 size 变量来记录位置

<script type="text/javascript">
	// arrayToStack
	var size =0;
	function peek(arr){  // 返回栈顶元素
		if (size == 0) {
			console.log(" This Stack is empty!")
			return;
		}
		console.log(" 栈顶元素: "+arr[size-1]);
	}
	function push(arr,n){  // 入栈操作
		if (size == arr.length) {
			console.log(" This Stack is full!")
			return;
		}
		arr[size++] = n;
		console.log( n + " 成功入栈!");
	}
	function pop(arr){  // 出栈操作
		if (size == 0) {
			console.log(" This Stack is empty!")
			return;
		}
		console.log( arr[--size] + " 成功出栈!");
	}
	var arr = [];
	arr.length = 3;
	push(arr,3);  // 3 成功入栈!
	push(arr,5);  // 5 成功入栈!
	peek(arr);  //  栈顶元素: 5
	pop(arr);  // 5 成功出栈!
	peek(arr);  // 栈顶元素: 3
</script>

 

二、仅用队列结构实现栈结构

1.思路:

  ① 先准备两个队列 queue、help;

  ② queue 用来实现出入栈操作;

  ③ 出栈时: queue先把前面的值push进help里,然后弹出栈顶的数;

  ④ 入栈:queue的队尾push一个数;

  ⑤ 出栈后,交换queue和help两个队列。

<script type="text/javascript">
	// queueToStack
	var queue = [],help = [],length = 3;  // 先默认长度为3
	function peek(){  // 返回栈顶元素
		if (queue.length == 0) {
			console.log("This Stack is empty!");
			return;
		}
		console.log("栈顶元素:" + queue[queue.length-1]);
	}
	function pushStack(n){  // 入栈操作
		if (queue.length == length) {
			console.log("This Stack is full!");
			return;
		}
		queue.push(n);
		console.log( n + " 成功入栈!");
	}
	function popStack(){  // 出栈操作
		if (queue.length == 0) {
			console.log("This Stack is empty!");
			return;
		}
		help = queue.splice(0,queue.length-1);
		console.log( queue.pop() + " 成功出栈!");
		swap();
	}
	function swap(){
		var temp;
		temp = queue;
		queue = help;
		help = temp; 
	}
	pushStack(5);  // 5 成功入栈!
	pushStack(3);  // 3 成功入栈!
	pushStack(1);  // 1 成功入栈!
	peek();  // 栈顶元素:1
	popStack();  // 1 成功出栈!
	peek();  // 栈顶元素:3
	pushStack(8);  // 8 成功入栈!
	peek();  // 栈顶元素:8
</script>

三、仅用栈结构实现队列结构

1.思路:

  ① 先准备两个栈 stackPush、stackPop;

  ② 入队时:只在 stackPush 进行 push 操作;

  ③ 出队时: 考虑3种情况:

     - stackPush、stackPop 都为空,则无法出队;

     - stackPush不为空,stackPop为空:将stackPush除了第一个数去,都移到stackPop里,出队数为第一个数;

     - stackPush、stackPop 都不为空:出队数为stackPop的最后一个数;

<script type="text/javascript">
	// stackToQueue
	var stackPush = [],stackPop = [],length = 3;
	function peek(){  // 返回队头元素
		if (stackPush.length == 0 && stackPop.length == 0) {
			console.log("This Queue is empty!");
			return;
		}
		if(stackPop.length != 0){
			console.log("队头元素:" + stackPop[stackPop.length-1]);
			return;
		}
		console.log("队头元素:" + stackPush[0]);
	}
	function pushQueue(n){  // 入队操作
		if (stackPush.length == length) {
			console.log("This Queue is full!");
			return;
		}
		stackPush.push(n);
		console.log( n + " 成功入队!");
	}
	function popQueue(){  // 出队操作
		if (stackPush.length == 0 && stackPop.length == 0) {
			console.log("This Queue is empty!");
			return;
		}
		if (stackPop.length == 0 && stackPush.length != 0) {
			stackPop = (stackPush.splice(1,stackPush.length-1)).reverse();
			console.log( stackPush.pop() + " 成功出队!");
			return;
		}
		console.log( stackPop.pop() + " 成功出队!");
	}
	pushQueue(3);  // 3 成功入队!
	pushQueue(5);  // 5 成功入队!
	pushQueue(8);  // 8 成功入队!
	peek();  // 队头元素:3
	popQueue();  // 3 成功出队!
	pushQueue(1);  // 1 成功入队!
	peek();  // 队头元素:5
	popQueue();  // 5 成功出队!
	popQueue();  // 5 成功出队!
	popQueue();  // 5 成功出队!
	popQueue();  // This Queue is empty!
</script>

四、总结

        通过这次的学习,我完成了数组结构实现队列、栈的逻辑实现,以及仅用队列结构实现栈结构和仅用栈结构实现队列结构的实现。收获还是很大的,更了解了这三者之间的位置转换,也对js的函数、变量等有了更深刻的理解,更深刻的是熟悉了部分数组方法的使用。再接再厉吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章