데이터 구조는 앞서 언급한 바 있습니다. 스택은 후입선출 원칙을 따르는 정렬된 컬렉션입니다. 책에 있는 스택에 대한 설명은 접시 더미처럼 매우 정확합니다. 아래쪽에 있어야 하고 위쪽은 아래쪽에 배치해야 합니다. 요소가 스택에 추가되면 추가된 첫 번째 요소는 스택의 맨 아래에 있고 마지막으로 추가된 요소를 맨 위 요소라고 합니다.
구체적인 내용은
스택 생성: js에서는 스택에 비유하여 배열을 사용합니다
스택에 요소 추가 push()
요소 제거 delete()
스택 크기 size()
스택의 최상위 요소 보기 peek()
스택이 비어 있는지 확인 isEmpty()
스택 비우기()
print stack print ()
function Stack(){ var stack=[]; this.push=function(para){ stack.push(para); }; this.delete=function(){ // 删除栈顶元素 stack.pop();//删除数组末尾元素, } this.size=function(){ return stack.length; } this.peek=function(){ return stack[stack.length-1]; } this.isEmpty=function(){ if(stack.length==0){ return true; }else{ return false; } } this.emptyStack=function(){ stack=[]; } this.print=function(){ return stack.toString(); } }use
var myStack=new Stack(); myStack.push(1); myStack.push(4); myStack.push(6); console.log('删除前栈内元素'+myStack.print()); console.log('删除前栈顶元素'+myStack.peek()); console.log('删除前栈元素size'+myStack.size()); myStack.delete(); console.log('删除后栈内元素'+myStack.print()); console.log('删除后栈顶元素'+myStack.peek()); console.log('删除前栈元素size'+myStack.size()); console.log('栈是否为空'+myStack.isEmpty()); myStack.emptyStack(); console.log('清空栈,栈是否为空'+myStack.isEmpty()); console.log('清空栈,栈元素size'+myStack.size());queueaue
first, 먼저, Meng Po Soup, 오는 사람들 먼저 오는 사람이 줄을 서게 되며, 대기열이 끝나면 앞에서 술을 다 마신 사람이 환생해야 합니다. 작업 대기열에서도 마찬가지입니다. 큐와 요소는 큐의 끝에서부터 추가됩니다. 구현은 스택과 거의 동일합니다
function Queue(){ var queue=[]; this.push=function(para){ queue.push(para); } this.delete=function(){ // 从队首移除,即删除的是数组第一位 queue.shift(); } this.queueFront=function(){ return queue[0]; } this.isEmpty=function(){ if(queue.length==0){ return true; }else{ return false; } } this.size=function(){ return queue.length; } this.emptyQueue=function(){ queue=[]; } this.print=function(){ return queue.toString(); } }var myQueue=new Queue(); myQueue.push(1); myQueue.push(4); myQueue.push(6); console.log('删除前队列内元素'+myQueue.print()); console.log('删除前队列顶元素'+myQueue.queueFront()); console.log('删除前队列元素size'+myQueue.size()); myQueue.delete(); console.log('删除后队列内元素'+myQueue.print()); console.log('删除后队列顶元素'+myQueue.queueFront()); console.log('删除前队列元素size'+myQueue.size()); console.log('队列是否为空'+myQueue.isEmpty()); myQueue.emptyQueue(); console.log('清空队列,队列是否为空'+myQueue.isEmpty()); console.log('清空队列,队列元素size'+myQueue.size());구현의 차이삭제 작업과 첫 번째(스택의 최상위) 요소에 액세스하는 방법이 다릅니다. 이는 마지막의 원칙이 다르기 때문입니다. -in-first-out 및 first-in-first-out. 삭제되는 것은 배열의 마지막 비트(pop())이고 큐는 배열의 첫 번째 비트(shift())를 삭제합니다. 스택의 최상위 요소는 배열의 마지막 비트이고 큐의 첫 번째 요소는 배열의 첫 번째 요소입니다. 이 책은 ES6의 새로운 기능으로 작성된 구현 방법을 사용합니다. 음, ES6에 대해서는 잘 모릅니다. 앞으로 지켜보겠습니다~~~
게다가 우선 순위 대기열
직접 말하면 , 책에는 우선 순위가 더 낮은 것이 Front라고 규정되어 있습니다. 그러다가 제가 직접 구현한 코드가 책에 나온 코드와 다릅니다. 먼저 책에 코드를 올려보세요.
function PriorityQueue(){ let items=[]; function QueueElement(element,priority){ this.element=element; this.priority=priority; } this.enqueue=function(element,priority){ let queueElement=new QueueElement(element, priority); let added=false; for(let i=0;i<items.length;i++){ if(queueElement.priority<isFinite([i].priority)){ items.splice(i,0,queueElement); added=true; break; } } if(!added){ items.push(queueElement); } }; this.print=function(){ return items; } }var pq=new PriorityQueue(); pq.enqueue('aa',2); pq.enqueue('aba',4); pq.enqueue('jjjj',8); pq.enqueue('aaaaaaa',8); pq.enqueue('aa',-1); console.log(pq.print());
function PriorityQueue(){ // 按优先级从小到大排列, var queue=[]; function QueueElement(ele,prior){ this.element=ele; this.prior=prior; } this.enqueue=function(ele,prior){ //循环遍历队列内所有元素,如果当前优先级小,则放在该位之前 var curr=new QueueElement(ele, prior); if(queue.length==0){ queue.push(curr); }else{ if(curr.prior<=queue[0].prior){ queue.splice(0,0,curr); }else{ queue.push(curr); } } } this.print=function(){ return queue; } }var pq=new PriorityQueue(); pq.enqueue('aa',2); pq.enqueue('aba',4); pq.enqueue('jjjj',8); pq.enqueue('aaaaaaa',8); pq.enqueue('aa',-1); console.log(pq.print());
this.print=function(){ var result=[]; for(let j = 0, length2 = items.length; j < length2; j++){ result[j]=items[j].element; } return result; }
Linked list
단일 연결 목록
연결 목록 클래스의 메서드에는 다음이 포함됩니다.append(para) 在链表尾部添加元素appendAt(element,index) 在指定位置添加元素deleteAt(index) 删除指定位置的链表元素getHead() 获得链表头元素size() 获得链表大小print() 打印出链表内容
toString() 输出链表元素的内容indexOf(para) 查找元素如果在链表中找到了就返回他的位置,没找到就返回-1isEmpty() 判断链表是否为空size() 获取链表长度
문단을 작성하는 것이기 때문에 기능이 함께 작성되지 않도록 섹션을 테스트하여 먼저 분리한 후 나중에 요약합니다.
function LinkList(){ let Node=function(element){ this.element=element; this.next=null; }; var list=[]; let length=0; let head=null; let currNode=null; this.append=function(para){ //链表尾部追加元素 var node=new Node(para); var current;//一直指向上一个添加的节点 if(head==null){ //插入第一个元素 head=node; currNode=head; // console.log(head); }else{ //不是第一个元素 //上一个的next指针指向当前node; currNode.next=node; // console.log(currNode); currNode=node; } length++; // list.push(node); } this.getHead=function(){ return head; } this.appendAt=function(element,index){ if(index>=0 && index<=length){ var node=new Node(element); var current=head; var previous; var position=0; if(index==0){ node.next=current; head=node; }else{ while(position++<index){ previous=current; current=current.next } node.next=current; previous.next=node; } length++; // return }else{ alert("参数错误"); } } this.deleteAt=function(index){ //从特定位置移除一个元素,index索引 if(index>=0 && index<length){ var previousNode=null; var node=head; var position=0; if(index==0){ head=node.next; return node.element; }else{ // console.log(node); while(position++<index){ // console.log(node); previousNode=node; node=node.next; } previousNode.next=node.next; return node.element; } }else{ alert("参数不正确!"); return null; } length--; } this.size=function(){ return list.length; } this.print=function(){ var result=[]; for(let i = 0, length1 = list.length; i < length1; i++){ result[i]=list[i]; } return result; } }
var linkList=new LinkList(); linkList.append('lorry1'); linkList.append('lorry2'); linkList.append('lorry3'); linkList.appendAt('lorry4',0); linkList.appendAt('lorry5',0);// 那么当前链表的元素顺序是 lorry5,lorry4,lorry1,lorry2,lorry3console.log(linkList.deleteAt(2)); console.log(linkList.getHead().next);//获取头元素的下一个元素
控制台打印出来的内容:lorry1 linkList.js:112 Node {element: "lorry4", next: Node} linkList.js:115 element:"lorry4" next:Node {element: "lorry2", next: Node} __proto__:Object
toString, size, indexOf 메서드
this.toString=function(){ var current=head; var str=''; var i=0; while(current){ str+=current.element+' '; current=current.next; } return str; } this.indexOf=function(para){ //返回首个出现该参数的位置 var current=head; var index=-1; // var i=0; while(current){ index+=1; if(current.element==para){ return index; } current=current.next; } return -1; } this.isEmpty=function(){ return length==0; } this.size=function(){ return length; }
var linkList=new LinkList(); linkList.append('lorry1'); linkList.append('lorry2'); linkList.append('lorry3'); linkList.appendAt('lorry4',0); linkList.appendAt('lorry5',1); linkList.appendAt('lorry5',0);console.log('我删除了...'+linkList.deleteAt(1));console.log('头元素下一个元素是...'+linkList.getHead().next.element);console.log('删除后链表内容...'+linkList.toString());console.log('lorry5在链表中的位置...'+linkList.indexOf('lorry5'));console.log('lorriy5在链表中的位置....'+linkList.indexOf('lorriy5'));console.log('链表长度...'+linkList.size());
linkList.js:143 我删除了...lorry4linkList.js:145 头元素下一个元素是...lorry5linkList.js:146 删除后链表内容...lorry5 lorry5 lorry1 lorry2 lorry3 linkList.js:147 lorry5在链表中的位置...0linkList.js:148 lorriy5在链表中的位置....-1linkList.js:150 链表长度...5
위 내용은 js 스택, 큐 및 연결 목록 데이터 구조의 구현 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!