本文详细解析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程序设计有所帮助。