目录
一、利用数组结构实现大小固定的队列和栈
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的函数、变量等有了更深刻的理解,更深刻的是熟悉了部分数组方法的使用。再接再厉吧!