摘要:概述今天來看看棧這種線性數(shù)據(jù)結(jié)構(gòu),非常的基礎(chǔ),我舉個(gè)例子你就能明白了。這種滿足了先進(jìn)后出,后進(jìn)先出特點(diǎn)的數(shù)據(jù)結(jié)構(gòu),就叫做棧。相信結(jié)合上圖你能夠看到,棧這種數(shù)據(jù)結(jié)構(gòu),插入和刪除的操作都被局限在了棧的一端,插入數(shù)據(jù)叫做入棧,刪除數(shù)據(jù)叫做出棧。
1. 概述
今天來看看棧這種線性數(shù)據(jù)結(jié)構(gòu),非常的基礎(chǔ),我舉個(gè)例子你就能明白了。比如你桌子上堆放的一摞文件,最先放的在最下面,拿的時(shí)候也是最后拿,最后放的在最上面,拿的時(shí)候也先拿到。這種滿足了 先進(jìn)后出,后進(jìn)先出 特點(diǎn)的數(shù)據(jù)結(jié)構(gòu),就叫做棧。
相信結(jié)合上圖你能夠看到,棧這種數(shù)據(jù)結(jié)構(gòu),插入和刪除的操作都被局限在了棧的一端,插入數(shù)據(jù)叫做入棧,刪除數(shù)據(jù)叫做出棧。
2. 棧的實(shí)現(xiàn)
棧有兩種實(shí)現(xiàn)方式,一是使用數(shù)組,這種實(shí)現(xiàn)叫做順序棧,二是使用鏈表,叫做鏈?zhǔn)綏?。下面是其?shí)現(xiàn)的代碼:
順序棧的代碼實(shí)現(xiàn)
public class ArrayStack { private String[] items;//儲存數(shù)據(jù)的數(shù)組 private int size;//棧中數(shù)據(jù)個(gè)數(shù) public ArrayStack(int capacity) { this.items = new String[capacity]; this.size = 0; } public ArrayStack() { this(10); } //入棧 public boolean push(String value) { //如果棧已滿,則擴(kuò)容數(shù)組 if(size == items.length) resize(items.length * 2); items[size ++] = value; return true; } //出棧 public String pop() { if(size == 0) return null; return items[-- size]; } //獲取棧頂元素 public String peek() { if(size == 0) return null; return items[size - 1]; } //重新設(shè)置數(shù)組大小,用于擴(kuò)容 private void resize(int newSize) { String[] temp = new String[newSize]; for (int i = 0; i < items.length; i++) { temp[i] = items[i]; } items = temp; } }
鏈?zhǔn)綏5拇a實(shí)現(xiàn)
public class LinkedListStack { private Node head = null;//棧頂元素 private int size = 0;//棧中元素個(gè)數(shù) //入棧 public boolean push(String value) { Node node = new Node(value); if(head == null) { head = node; this.size ++; return true; } node.next = head; head = node; this.size ++; return true; } //出棧 public String pop() { if(head == null) return null; String result = head.data; head = head.next; this.size --; return result; } //獲取棧頂元素 public String peek() { if(head == null) return null; return head.getData(); } //判斷棧是否為空 public boolean isEmpty() { return this.head == null; } //棧中元素的個(gè)數(shù) public int size() { return this.size; } //清空棧 public void clear() { this.head = null; this.size = 0; } //打印棧中所有的元素 public void print() { Node pNode = head; while(pNode != null) { System.out.print(pNode.getData() + " "); pNode = pNode.next; } System.out.println(); } //定義棧的節(jié)點(diǎn) public static class Node{ private String data; private Node next; public Node(String data) { this.data = data; this.next = null; } public String getData() { return data; } } }
3. 棧練習(xí)
下面思考一個(gè)練習(xí)題:如何使用棧來實(shí)現(xiàn)瀏覽器的前進(jìn)和后退功能?我們在使用瀏覽器的時(shí)候,會新打開一個(gè)網(wǎng)頁,如果連續(xù)打開了多個(gè)網(wǎng)頁,我們可以后退,也可以前進(jìn),如果這時(shí)候又新打開了一個(gè)網(wǎng)頁,那就不能在新頁面中前進(jìn)了。使用棧,我們可以輕松實(shí)現(xiàn)這個(gè)功能。
瀏覽器的前進(jìn)后退功能代碼實(shí)現(xiàn)
public class BrowserForwardAndBack { private LinkedListStack forward; private LinkedListStack back; public BrowserForwardAndBack() { this.forward = new LinkedListStack(); this.back = new LinkedListStack(); } //新打開一個(gè)頁面 public void open(String url) { //將其保存到前進(jìn)的棧中 this.forward.push(url); //如果后退的棧不為空,則清空后退的棧 if(!back.isEmpty()) back.clear(); System.out.println("新打開一個(gè)頁面,url = " + url); } //前進(jìn),從back中取出內(nèi)容到forward中 public void goForward() { if(this.back.isEmpty()) { System.out.println("前面沒有頁面!"); return; } this.forward.push(this.back.pop()); System.out.println("前進(jìn)一個(gè)頁面,當(dāng)前頁面為:" + this.forward.peek()); } //后退,從forward中取出內(nèi)容到back中 public void goBack() { if(this.forward.size() <= 1) { System.out.println("后面沒有頁面!"); return; } this.back.push(this.forward.pop()); System.out.println("后退一個(gè)頁面,當(dāng)前頁面為:" + this.forward.peek()); } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73739.html
摘要:于是翻出了機(jī)房里的這本學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法開始學(xué)習(xí)程序員的基礎(chǔ)知識。這本書用了我最熟悉的來實(shí)現(xiàn)各種數(shù)據(jù)結(jié)構(gòu)和算法,而且書很薄,可以說是一本不錯(cuò)的入門教程。隊(duì)列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之棧與隊(duì)列第二篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之鏈表第三篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之集合第四篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法之字典和散列表第五篇文章:學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算...
摘要:下一篇數(shù)據(jù)結(jié)構(gòu)與算法鏈表寫在前面說明數(shù)據(jù)結(jié)構(gòu)與算法系列文章的代碼和示例均可在此找到原計(jì)劃是把你不知道的三部全部看完的,偶然間朋友推薦了數(shù)據(jù)結(jié)構(gòu)與算法的一套入門視頻,學(xué)之。手頭上恰好有學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的書籍,便轉(zhuǎn)而先把數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)。 下一篇:JS數(shù)據(jù)結(jié)構(gòu)與算法_鏈表 寫在前面 說明:JS數(shù)據(jù)結(jié)構(gòu)與算法 系列文章的代碼和示例均可在此找到 原計(jì)劃是把《你不知道的Javascript》...
摘要:之?dāng)?shù)組操作接下來就是數(shù)據(jù)結(jié)構(gòu)的第一部分,棧。以字符串顯示棧中所有內(nèi)容方法的實(shí)現(xiàn)說明需要往棧中添加新元素,元素位置在隊(duì)列的末尾。的前端樂園原文鏈接寒假前端學(xué)習(xí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,棧與隊(duì)列 本系列的第一篇文章: 學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(一),棧與隊(duì)列第二篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(二):鏈表第三篇文章:學(xué)習(xí)JavaScript數(shù)據(jù)結(jié)構(gòu)與算法(三):集合第...
摘要:棧數(shù)據(jù)結(jié)構(gòu)棧是一種遵循后進(jìn)先出原則的有序集合。新添加的或待刪除的元素都保存在棧的同一端,叫做棧頂,另一端叫棧底。在棧中,新元素靠近棧頂,舊元素接近棧底。 我們可以在數(shù)組的任何位置上刪除或者添加元素,但有時(shí)候我們還需要在元素的添加或刪除時(shí)有更多控制的數(shù)據(jù)結(jié)構(gòu),有兩種數(shù)據(jù)結(jié)構(gòu)類似于數(shù)組,但在添加或刪除元素時(shí)更為可控,它們就是棧和隊(duì)列。本節(jié)主要介紹棧。 1.棧數(shù)據(jù)結(jié)構(gòu) 棧是一種遵循后進(jìn)先出(...
摘要:前言數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。方法調(diào)用編寫的程序在進(jìn)行方法函數(shù)調(diào)用時(shí),會完成對方法的壓棧操作,等方法執(zhí)行結(jié)束后,對應(yīng)的會完成對方法的彈棧操作。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。本文介紹數(shù)據(jù)結(jié)構(gòu)中的棧的概念、存儲結(jié)構(gòu)、棧的特點(diǎn)以及棧的適用場景,另外會穿插介紹面試中的一些經(jīng)典問題...
摘要:基本解決方案按照上述的大體思路,我們給出解決方案入棧和出棧都在中完成,只作為臨時(shí)中轉(zhuǎn)空間。入棧入隊(duì)出棧除隊(duì)尾的元素外將其他所有元素出隊(duì),再入隊(duì)中轉(zhuǎn)暫存,然后將中的元素出隊(duì)出棧。 聲明:碼字不易,轉(zhuǎn)載請注明出處,歡迎文章下方討論交流。 前言:Java數(shù)據(jù)結(jié)構(gòu)與算法專題會不定時(shí)更新,歡迎各位讀者監(jiān)督。本篇介紹的是如何用兩個(gè)隊(duì)列實(shí)現(xiàn)棧的問題。這道題作為上一篇文章算法面試:棧實(shí)現(xiàn)隊(duì)列的方案的姊...
閱讀 2903·2019-08-30 15:55
閱讀 2014·2019-08-30 14:02
閱讀 1251·2019-08-29 15:23
閱讀 1015·2019-08-29 11:27
閱讀 472·2019-08-26 11:43
閱讀 3201·2019-08-26 10:32
閱讀 1263·2019-08-23 14:41
閱讀 3308·2019-08-23 14:41