JavaScript栈和队列的实现原理与代码详解

作者:半夏

时间:2026-10-22

浏览:306

本文详细解析JavaScript中栈和队列两种数据结构的实现原理。通过构造函数、数组操作及核心方法如push、pop、peek等,展示如何构建具备后进先出(LIFO)特性的栈和先进先出(FIFO)特性的队列,并提供完整的类定义代码供参考。

文章目录

本文通过具体实例,深入讲解JavaScript中栈(Stack)与队列(Queue)这两种数据结构的实现方式及核心操作方法,旨在为读者提供清晰的参考与学习路径。

栈的基本概念与操作

一、栈的基本概念

栈是一种特殊的线性表,其数据存取遵循特定规则:所有元素的插入和删除操作仅允许在栈顶进行。这意味着栈内的元素只能通过栈顶这一端进行访问,其他位置的元素无法直接触及。

栈的核心特征是后进先出(Last-In-First-Out,简称LIFO)。这种机制意味着最后进入栈的元素最先被移除,因此非栈顶元素无法被直接访问或操作。

二、栈的基本操作

栈主要包含两种基础操作:将元素压入栈(入栈)和将元素从栈中移除(出栈)。

入栈操作对应push();
,出栈操作对应pop();。

此外,还可以预览栈顶元素,该操作对应peek();。

需要注意的是,虽然pop()可以访问栈顶元素,但调用该操作后,栈顶元素会从栈中被永久移除。相比之下,方法仅返回栈顶元素的值,不会改变栈的状态,即不删除该元素。

栈的具体实现

三、栈的具体实现

首先定义Stack类的构造函数,初始化内部数据结构。


function Stack(){
 this.dataStore=[];//数组dataStore保存栈内元素,初始化为空数组
 this.top=0;
 //top为栈顶位置,被构造函数初始化为0,表示栈顶对应数组的起始位置0
 this.push=push;
 this.pop=pop;
 this.peek=peek;
}

接下来实现push()方法,用于向栈中添加元素。


function push(element){
 this.dataStore[this.top++]=element;
}

随后实现pop()方法,用于从栈中移除并返回元素。


function pop(element){
 return this.dataStore[--this.top];
 //pop方法与push方法相反,它返回栈顶元素,同时将变量top的值减1
}

接着实现peek()方法,用于查看栈顶元素。


function peek(element){
 return this.dataStore[this.top-1];
 //peek方法返回数组的第top-1个位置的元素,即栈顶元素。
}

如果对一个空栈调用peek()方法,由于栈内无元素,栈顶位置为空,因此返回结果为undefined。

实现length()方法,用于获取栈中元素的个数。

为了知道栈内存储了多少元素,length()方法通过返回变量top的值来体现栈内的元素数量。


function length(){
 return this.top();
}

实现clear()方法,用于清空栈。

clear()操作将变量top的值重置为0,从而实现清空栈的效果。


function clear(){
 this.top=0;
}

综上所述,Stack类的完整定义如下。


function stack(){
 this.dataStore=[];
 this.top=0;
 this.push=push;
 this.pop=pop;
 this.peek=peek;
 this.clear=clear;
 this.length=length;
}
function push(element){
 this.dataStore[this.top++]=element;
}
function peek(){
 return this.dataStore[this.top-1];
}
function pop(){
 return this.dataStore[--this.top];
}
function clear(){
 this.top=0;
}
function length(){
 return this.top;
}

队列的基本概念与操作

二、队列的基本概念

队列也是一种列表结构,但其操作受限:元素只能在队尾插入,在队首删除。队列用于存储按顺序排列的数据,遵循先进先出(First-In-First-Out,FIFO)原则。

三、队列的基本操作

队列主要包含两种操作:入队(在队尾插入新元素)和出队(删除队首元素)。此外,还可以读取队头元素,该操作对应peek()。

入队操作在数组末尾添加元素,对应push()。


names=[];
names.push("hling");
names.push("aling");
print(names); //显示hling,aling

出队操作删除数组中第一个元素,对应shift()。


names.shift();
print(names); //显示aling

队列的具体实现

定义Queue类,初始化内部数据结构。


function Queue(){
 this.dataStore=[];
 this.enqueue=enqueue;
 this.dequeue=dequeue;
 this.front=front;
 this.back=back;
 this.toString=toString;
 this.empty=empty;
}

实现enqueue()方法,用于向队尾添加元素。


function enqueue(element){
 this.dataStore.push(element);
}

实现dequeue()方法,用于从队首移除元素。


function dequeue(element){
 return this.dataStore.shift(element);
}

实现读取队首和队尾元素的方法。


function front(){
 return this.dataStore[0];
}
function back(){
 return this.dataStore[this.dataStore.length-1];
}

toString()方法用于显示队列内的所有元素。


function toString(){
 var retStr="";
 for(var i=0;i<this.dataStore.length;i++){
  retStr+=this.dataStore[i]+"\n";
 }
 return retStr;

empty()方法用于判断队列是否为空。


function empty(){
 if(this.dataStore.length==0){
  return true;
 }else{
  return false;
 }
}

四、Queue队列类的完整定义


function Queue(){
 this.dataStore=[];
 this.enqueue=enqueue;
 this.dequeue=dequeue;
 this.front=front;
 this.back=back;
 this.toString=toString;
 this.empty=empty;
}
function enqueue(element){
 this.dataStore.push(element);
}
function dequeue(element){
 return this.dataStore.shift(element);
}
function front(){
 return this.dataStore[0];
}
function back(){
 return this.dataStore[this.dataStore.length-1];
}
function toString(){
 var retStr="";
 for(var i=0;i<this.dataStore.length;i++){
  retStr+=this.dataStore[i]+"\n";
 }
return retStr;
function empty(){
 if(this.dataStore.length==0){
  return true;
 }else{
  return false;
 }
}

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文关于栈和队列实现的描述能对读者的JavaScript程序设计有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章