前言
其實感覺這都不算演算法題,不過每天時間有限,也就記錄一下了,(ps:程式設計師簡潔風,以後就上題解題說個人思路,嗯,珍愛生命,遠離小菜)
題
固定陣列實現棧結構及佇列結構
基礎知識
- 棧:後進先出 可以抽象為一個子彈夾,只有一個出入口
- 佇列:先進先出 可以抽象為一個排隊,出入口分別在隊首和隊尾
解題思路
- 實現棧
- 用一個變數指標指向出入口,即永遠指向最新資料的索引的變數(index)
- 用size變數表達棧中實際資料量
- 考慮棧空、棧滿等問題throw出異常
- 實現佇列
- star變數指向新增時的索引的變數,end指向彈出時的索引的變數
- 用一個size變數使得star和end進行解耦,使得邊界問題轉化成佇列長度與size的比較
- 考慮佇列空、佇列滿等問題throw出異常
程式碼實現
//固定陣列實現棧結構
class arrStrack{
constructor(initSize){
if(initSize<0){
throw new Error('棧長度不能為負數')
}
this.initSize = initSize; //棧的長度
this.index = -1; //永遠指向最新資料的索引的變數
this.arr = [];
this.size = 0;//實際資料長度
}
/**
*
* @param {陣列初始大小} initSize
*/
push(ele){
if((this.index+1) == this.initSize){
throw new Error('棧溢位')
}
this.size++;
this.arr[++this.index]=ele;
}
pop(){
if(this.size==0) throw new Error('棧為空')
this.index--;
return this.arr[--this.size];
}
}
let strack = new arrStrack(3);
strack.push('hhh');
console.log(strack.pop())
//固定陣列實現佇列結構
class arrQueue{
constructor(initSize){
if(initSize<0){
throw new Error('佇列長度不能為負數')
}
this.initSize = initSize; //佇列的長度
this.star = 0; //指向新增時的索引的變數
this.end = 0;//指向彈出時的索引的變數
this.arr = [];
this.size = 0;//實際資料長度
}
push(ele){
if(this.size >= this.initSize) throw new Error('佇列溢位');
this.arr[this.star++] = ele;
this.star = (this.star+1) >this.initSize ? 0 : this.star++;
}
poll(){
if(this.size == 0) throw new Error('佇列為空');
this.end = (this.end+1) > this.initSize ? 0 :this.end++;
size--;
}
}
複製程式碼