数据结构之栈 今天药忘吃喽~ 2022-02-05 05:09 282阅读 0赞 数据结构栈的相关学习: ## 简介 ## 限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端成为栈顶,另一端成为栈低,不含任何元素的栈成为空栈,栈又称为先进先出的线性表,简称LIFO结构。 栈的插入操作,叫做进栈,也称压栈,入栈。 栈的删除操作,也叫出战,也有的叫做弹栈。 ## 入栈 ## ![E5_85_A5_E6_A0_88_E6_93_8D_E4_BD_9C.gif][] ## 出栈 ## ![E5_87_BA_E6_A0_88_E6_93_8D_E4_BD_9C.gif][] ## 实现一个栈 ## 栈主要包含两个操作,入栈和出栈,也就是在栈顶插入一个数据和从栈顶删除一个数据。栈既可以用数组来实现,也可以用链表来实现。用数组实现的栈,我们叫作顺序栈,用链表实现的栈,我们叫作链式栈。 根据上一节我们实现的数组代码我们来实现一个自己的栈。 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br></pre></td> <td><pre><span><span>public</span> <span><span>interface</span> <span>Stack</span><<span>E</span>> </span>{ </span><br><span></span><br><span> <span><span>int</span> <span>getSize</span><span>()</span></span>; <span>//获取栈大小</span></span><br><span> <span><span>boolean</span> <span>isEmpty</span><span>()</span></span>; <span>//判断是否为空</span></span><br><span> <span><span>void</span> <span>push</span><span>(E e)</span></span>; <span>//压栈</span></span><br><span> <span>E <span>pop</span><span>()</span></span>; <span>//弹栈</span></span><br><span> <span>E <span>peek</span><span>()</span></span>; <span>//查看栈顶</span></span><br><span>}</span><br></pre></td> </tr> </tbody> </table> <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br><span>14</span><br><span>15</span><br><span>16</span><br><span>17</span><br><span>18</span><br><span>19</span><br><span>20</span><br><span>21</span><br><span>22</span><br><span>23</span><br><span>24</span><br><span>25</span><br><span>26</span><br><span>27</span><br><span>28</span><br><span>29</span><br><span>30</span><br><span>31</span><br><span>32</span><br><span>33</span><br><span>34</span><br><span>35</span><br><span>36</span><br><span>37</span><br><span>38</span><br><span>39</span><br><span>40</span><br><span>41</span><br><span>42</span><br><span>43</span><br><span>44</span><br><span>45</span><br><span>46</span><br><span>47</span><br><span>48</span><br><span>49</span><br><span>50</span><br><span>51</span><br><span>52</span><br><span>53</span><br><span>54</span><br><span>55</span><br></pre></td> <td><pre><span><span>public</span> <span><span>class</span> <span>ArrayStack</span><<span>E</span>> <span>implements</span> <span>Stack</span><<span>E</span>> </span>{ </span><br><span></span><br><span> <span>private</span> Array<E> array;</span><br><span></span><br><span> <span><span>public</span> <span>ArrayStack</span><span>(<span>int</span> capacity)</span></span>{ </span><br><span> array = <span>new</span> Array<>(capacity);</span><br><span> }</span><br><span></span><br><span> <span><span>public</span> <span>ArrayStack</span><span>()</span></span>{ </span><br><span> array = <span>new</span> Array<>();</span><br><span> }</span><br><span></span><br><span> <span>@Override</span></span><br><span> <span><span>public</span> <span>int</span> <span>getSize</span><span>()</span></span>{ </span><br><span> <span>return</span> array.getSize();</span><br><span> }</span><br><span></span><br><span> <span>@Override</span></span><br><span> <span><span>public</span> <span>boolean</span> <span>isEmpty</span><span>()</span></span>{ </span><br><span> <span>return</span> array.isEmpty();</span><br><span> }</span><br><span></span><br><span> <span><span>public</span> <span>int</span> <span>getCapacity</span><span>()</span></span>{ </span><br><span> <span>return</span> array.getCapacity();</span><br><span> }</span><br><span></span><br><span> <span>@Override</span></span><br><span> <span><span>public</span> <span>void</span> <span>push</span><span>(E e)</span></span>{ </span><br><span> array.addLast(e);</span><br><span> }</span><br><span></span><br><span> <span>@Override</span></span><br><span> <span><span>public</span> E <span>pop</span><span>()</span></span>{ </span><br><span> <span>return</span> array.removeLast();</span><br><span> }</span><br><span></span><br><span> <span>@Override</span></span><br><span> <span><span>public</span> E <span>peek</span><span>()</span></span>{ </span><br><span> <span>return</span> array.getLast();</span><br><span> }</span><br><span></span><br><span> <span>@Override</span></span><br><span> <span><span>public</span> String <span>toString</span><span>()</span></span>{ </span><br><span> StringBuilder res = <span>new</span> StringBuilder();</span><br><span> res.append(<span>"Stack: "</span>);</span><br><span> res.append(<span>'['</span>);</span><br><span> <span>for</span>(<span>int</span> i = <span>0</span> ; i < array.getSize() ; i ++){ </span><br><span> res.append(array.get(i));</span><br><span> <span>if</span>(i != array.getSize() - <span>1</span>)</span><br><span> res.append(<span>", "</span>);</span><br><span> }</span><br><span> res.append(<span>"] top"</span>);</span><br><span> <span>return</span> res.toString();</span><br><span> }</span><br><span>}</span><br></pre></td> </tr> </tbody> </table> ### 测试 ### <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br><span>14</span><br><span>15</span><br><span>16</span><br></pre></td> <td><pre><span><span>public</span> <span><span>class</span> <span>Main</span> </span>{ </span><br><span></span><br><span> <span><span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(String[] args)</span> </span>{ </span><br><span></span><br><span> ArrayStack<Integer> stack = <span>new</span> ArrayStack<>();</span><br><span></span><br><span> <span>for</span>(<span>int</span> i = <span>0</span> ; i < <span>6</span> ; i ++){ </span><br><span> stack.push(i); <span>//压栈</span></span><br><span> System.out.println(stack);</span><br><span> }</span><br><span></span><br><span> stack.pop(); <span>//弹栈</span></span><br><span> System.out.println(stack);</span><br><span> System.out.println(<span>"栈顶为:"</span>+stack.peek());</span><br><span> }</span><br><span>}</span><br></pre></td> </tr> </tbody> </table> ![20190503112010.png][] ## 分析 ## 不管是顺序栈还是链式栈,我们存储数据只要一个大小为 n 的数组就够了。入栈和出栈过程中,只需要一两个临时变量存储空间,所以空间复杂度是 O(1)。 这里存储数据需要一个大小为 n 的数组,并不是说空间复杂度就是 O(n)。因为,这 n 个空间 是必须的,无法省掉。所以我们说空间复杂度的时候,是指除了原本的数据存储空间外,算法运行还需要额外的存储空间。 出栈的时间复杂度仍然是 O(1)。但是,对于入栈操作来说,情况就不一样。当栈中有空闲空间时,入栈操作的时间复杂度 为 O(1)。但当空间不够时,就需要重新申请内存和数据搬移,所以时间复杂度就变成了 O(n)。 ## 摊还分析 ## 栈空间不够时,我们重新申请一个是原来大小两倍的数组;为了简化分析,假设只有入栈操作没有出栈操作;定义不涉及内存搬移的入栈操作为 simple-push 操作,时间复杂度为 O(1)。如果当前栈大小为 K,并且已满,当再有新的数据要入栈时,就需要重新申请 2 倍大小的内存,并 且做 K 个数据的搬移操作,然后再入栈。但是,接下来的 K-1 次入栈操作,我们都不需要再重新申请内存和搬移数据,所以这 K-1 次入栈操作都只需要一个 simple-push 操作就可以完成。 ![20190503113631.png][] ## 栈应用 ## ### 函数应用 ### 操作系统给每个线程分配了一块独立的内存空间,这块内存被组织成“栈”这种结构, 用来存储函数调用时的临时变量。每进入一个函数,就会将临时变量作为一个栈帧入栈,当被调用函数执行完成,返回之后,将这个函数对应的栈帧出栈。 ![E6_A0_88_E7_9A_84_E5_BA_94_E7_94_A8_E5_87_BD_E6_95_B0_E8_B0_83_E7_94_A8.gif][] ![20190503114934.png][] 这是一个比较费流量的GIF!!! ### 表达式求值 ### 我将算术表达式简化为只包含加减乘除四则运算,比如:34+13\*9+44-12/3。对于这个四则运算编译器就是通过两个栈来实现的。其中一个保存操作数的栈,另一个是保存运算符的栈。我们从左向右遍历表达式,当遇到数字,我们就直接压入操作数栈;当遇到运算符,就与运算符栈的栈顶元素进行比较。 如果比运算符栈顶元素的优先级高,就将当前运算符压入栈;如果比运算符栈顶元素的优先级低或者相同,从运算符栈中取栈顶运算符,从操作数栈的栈顶取 2 个操作数,然后进行计算,再把计算 完的结果压入操作数栈,继续比较。 ![E6_A0_88_E7_9A_84_E8_A1_A8_E8_BE_BE_E5_BC_8F.gif][] ### 在括号匹配 ### 我们假设表达式中只包含三种括号,圆括号 ()、方括号 \[\] 和花括号\{\},并且它们可以任意嵌套。比如,\{\[\{\}\]\}或 \[\{()\}(\[\])\] 等都为合法格式,而\{\[\}()\] 或 \[(\{)\] 为不合法的格式。在给你一个包含三种括号的表达式字符串。我们用栈来保存未匹配的左括号,从左到右依次扫描字符串。当扫描到左括号时,则将其压入栈中;当扫描到右括号时,从栈顶取出一个左括号。如果能够匹配,比 如“(”跟“)”匹配,“\[”跟“\]”匹配,“\{”跟“\}”匹配,则继续扫描剩下的字符串。如果扫描的过程中,遇到不 能配对的右括号,或者栈中没有数据,则说明为非法格式。当所有的括号都扫描完成之后,如果栈为空,则说明字符串为合法格式;否则,说明有未匹配的左括号,为非法格式。 <table> <tbody> <tr> <td><pre><span>1</span><br><span>2</span><br><span>3</span><br><span>4</span><br><span>5</span><br><span>6</span><br><span>7</span><br><span>8</span><br><span>9</span><br><span>10</span><br><span>11</span><br><span>12</span><br><span>13</span><br><span>14</span><br><span>15</span><br><span>16</span><br><span>17</span><br><span>18</span><br><span>19</span><br><span>20</span><br><span>21</span><br><span>22</span><br><span>23</span><br><span>24</span><br><span>25</span><br><span>26</span><br><span>27</span><br><span>28</span><br><span>29</span><br><span>30</span><br><span>31</span><br><span>32</span><br><span>33</span><br><span>34</span><br></pre></td> <td><pre><span><span>import</span> java.util.Stack;</span><br><span></span><br><span><span><span>class</span> <span>Solution</span> </span>{ </span><br><span></span><br><span> <span><span>public</span> <span>boolean</span> <span>isValid</span><span>(String s)</span> </span>{ </span><br><span></span><br><span> Stack<Character> stack = <span>new</span> Stack<>();</span><br><span> <span>for</span> (<span>int</span> i = <span>0</span>; i < s.length(); i++) { </span><br><span> <span>char</span> c = s.charAt(i);</span><br><span> <span>if</span> (c == <span>'('</span> || c == <span>'['</span> || c == <span>'{'</span>)</span><br><span> stack.push(c);</span><br><span> <span>else</span> { </span><br><span> <span>if</span> (stack.isEmpty())</span><br><span> <span>return</span> <span>false</span>;</span><br><span></span><br><span> <span>char</span> topChar = stack.pop();</span><br><span> <span>if</span> (c == <span>')'</span> && topChar != <span>'('</span>)</span><br><span> <span>return</span> <span>false</span>;</span><br><span> <span>if</span> (c == <span>']'</span> && topChar != <span>'['</span>)</span><br><span> <span>return</span> <span>false</span>;</span><br><span> <span>if</span> (c == <span>'}'</span> && topChar != <span>'{'</span>)</span><br><span> <span>return</span> <span>false</span>;</span><br><span> }</span><br><span> }</span><br><span> <span>return</span> stack.isEmpty();</span><br><span> }</span><br><span></span><br><span></span><br><span> <span><span>public</span> <span>static</span> <span>void</span> <span>main</span><span>(String[] args)</span> </span>{ </span><br><span></span><br><span> System.out.println((<span>new</span> Solution()).isValid(<span>"({[]})[]{}"</span>));</span><br><span> System.out.println((<span>new</span> Solution()).isValid(<span>"([)]"</span>));</span><br><span> }</span><br><span>}</span><br></pre></td> </tr> </tbody> </table> ![20190503121838.png][] [E5_85_A5_E6_A0_88_E6_93_8D_E4_BD_9C.gif]: /images/20220205/7d19cddc1b1144f1907731b976404959.png [E5_87_BA_E6_A0_88_E6_93_8D_E4_BD_9C.gif]: /images/20220205/70661c7400984de18a87086c4ef88566.png [20190503112010.png]: /images/20220205/8a31c58efd53475aa61ded6105325370.png [20190503113631.png]: /images/20220205/f0108e7622f240f88110e4b9522e5e8c.png [E6_A0_88_E7_9A_84_E5_BA_94_E7_94_A8_E5_87_BD_E6_95_B0_E8_B0_83_E7_94_A8.gif]: /images/20220205/ebf3bf20df74460d9538615772572b2b.png [20190503114934.png]: /images/20220205/762fe1f3298145a085aacf39386b888e.png [E6_A0_88_E7_9A_84_E8_A1_A8_E8_BE_BE_E5_BC_8F.gif]: /images/20220205/87451d3404dc406cb3c20fe5c1f51f80.png [20190503121838.png]: /images/20220205/14b5ec16d1b5440da4f1ee8581dd04a7.png
相关 数据结构之栈 一.什么是栈? 本文将介绍一个重要的数据结构—栈,和之前讲到的链表、数组一样也是一种数据呈线性排列的数据结构,不过在这种结构中,我们只能访问最新添加的数据。栈就像是一摞书, た 入场券/ 2022年10月14日 10:49/ 0 赞/ 173 阅读
相关 数据结构之栈 栈的介绍 1)栈是一个先入后出的有序列表 2)允许插入和删除的一端,为变化的一端,称为栈顶,另一端是固定的一端,为栈底 数组模拟栈 ![在这里插入图片描述][ ╰+攻爆jí腚メ/ 2022年08月31日 13:23/ 0 赞/ 166 阅读
相关 数据结构之栈 栈是一种先进后出的线性结构,只允许在一端插入删除,属于逻辑结构。 栈的定义 package com.zhiru; / 栈是一种先进后出 男娘i/ 2022年08月11日 03:27/ 0 赞/ 180 阅读
相关 数据结构之栈 1、定义:栈(stack)是限制在插入和删除只能在一个位置进行操作的一种表结构,该合位置是表的末端,称作栈顶(top),对栈的基本操作的push()进栈和pop()出栈,一般栈 ╰半夏微凉°/ 2022年08月06日 01:05/ 0 赞/ 197 阅读
相关 数据结构之栈 栈是一种数据结构,特点是先进后出。比较通俗的说那就一个容器一端是封闭的,只能是先来的后出去。 先是写一个使用数组的栈类ArrayStack. / ArraySt 秒速五厘米/ 2022年07月12日 03:43/ 0 赞/ 217 阅读
相关 数据结构之栈 头文件: using namespace std; template <class T> class MyStack { 妖狐艹你老母/ 2022年05月27日 05:39/ 0 赞/ 201 阅读
相关 数据结构之栈 一、顺序栈 1.0 理解栈 栈是一种比线性表还要简单的数据结构,因为他就是对线性表的限制后的数据结构 即 只允许在线性表的尾部进行插入和删除操作 偏执的太偏执、/ 2022年05月25日 02:37/ 0 赞/ 244 阅读
相关 数据结构之栈 什么是栈 从栈的操作特性上来看,栈是一种 “操作受限”的线性表,只允许在一端插入和删除数据,且满足先进后出、后进先出的特性。 实现一个栈 栈可以用数组或链表来实现 Bertha 。/ 2022年05月16日 14:29/ 0 赞/ 232 阅读
相关 数据结构之栈 数据结构栈的相关学习: 简介 限定仅在表尾进行插入和删除操作的线性表。允许插入和删除的一端成为栈顶,另一端成为栈低,不含任何元素的栈成为空栈,栈又称为先进先出的线性表 今天药忘吃喽~/ 2022年02月05日 05:09/ 0 赞/ 283 阅读
还没有评论,来说两句吧...