如何理解栈(栈的实现方式)

网上看到的一段对话,写的很清晰,一目了然。

Frank: 什么是栈?

Linda: 它是一种数据结构,按先进后出(或后进先出)的方式收集对象。它通常有一个 API,其中包括 push() 和 pop() 等方法。有时也有peek() 方法。

Frank: push() 有什么功能?

Linda: push() 接受一个输入对象,比如说 foo,并将它放入到一个内部容器(例如一个数组)中。push() 通常不返回结果。

Frank: 如果我 push() 两个对象,比如先是 foo,然后是 bar,结果会怎样?

Linda: 第二个对象 bar 应该在栈(至少包含两个对象)的顶部,所以如果调用 pop(),那么返回的应该是 bar,而不是 foo。如果再次调用pop(),那么应该返回 foo,然后栈为空(假设在添加这两个对象之前栈中没有对象)。

Frank: 也就是说,pop 移除最近放入栈中的项目?

Linda: 是的,pop() 应该移除最上面的项目(假设栈中还有可移除的项目)。peek() 与此类似,只是不移除栈中的对象。peek() 应该保留栈顶的项目。

Frank: 如果之前没有 push 任何项目,那么调用 pop() 时会怎样?

Linda: pop() 应该抛出一个异常,表明栈中尚未 push 任何项。

Frank: 如果 push()null 会怎样?

Linda: 栈应该抛出一个异常,因为 null 不是一个有效的可 push() 的值。

时间: 2024-10-11 13:55:18

如何理解栈(栈的实现方式)的相关文章

<深入理解计算机系统> 通过程序的机器级表示来理解函数栈

C源码: void swap(int *a,int *b) { int c; c = *a; *a = *b; *b = c; } int main(void) { int a ; int b ; int ret; a =16; b = 64; ret = 0; swap(&a,&b); ret = a - b; return ret; } 编译: gcc -g func_stack.c -o a.out objdump -dS a.out > main.dump 可以得到反汇编的汇

二叉树的遍历(基于栈的非递归方式实现)

在写二叉树的时候如果用递归实现二叉树的遍历很简单,但是用非递归来实现二叉树的遍历就不那么简单了需要一些技巧. 那为什么还要非递归实现呢?个人理解:如果树的高度很大,超过了允许递归的次数,那么就会出错,比如我记得python只允许递归100次(不知道记错没) 这时候用迭代就要保险的多,不会出错. 下面先来做基本的准备说明: 1 #include<iostream> 2 #include<stack> 3 4 #define null NULL 5 6 template<type

深入理解Java 栈数据结构

栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底.向一个栈插入新元素又称作进栈.入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素. 从上图是基于数组实现的栈,可以看到,对栈的操作(压栈.出栈)其实都是对栈顶元素的操作,因此压栈和出栈的速度都比较快.栈中元素按照FILO顺序排序的,即先入后出的规则,先放进去

栈的Node实现方式

/** * Implementation of a stack using nodes. * Unlimited size, no arraylist. * * @author Kyler Smith, 2017 */ public class NodeStack<Item> { /** * Entry point for the program. */ public static void main(String[] args) { NodeStack<Integer> Stac

Web全栈-网页的布局方式、浮动流基本概念

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>网页的布局方式</title> <style> /* div,h1,p{ border: 1px solid #000; } span,strong,b{ border: 1px solid #000; } */ *{ margin: 0; pa

包含min函数的栈 + 栈的压入、弹出序列

剑指offer 两道关于 数据结构——栈 的题目 1. 包含min函数的栈 简要分析一下这道题,这道题做了3遍才过,踩了一些小坑 看看示例: 得到了规律,那么关键部分的代码实现,就在于 两个栈(rawStack 和 minStack) 和 push() 方法 Stack<Integer> rawStack = new Stack<>(); Stack<Integer> minStack = new Stack<>(); public void push1(i

【原创】我所理解的资源加载方式

最近转战unity3d,接的第一个任务就是关于资源管理的部分. 由于项目是web和standalone(微端)并存的,所以希望保证业务逻辑尽量保持一致,跟之前ios,android的执行流程略有不同,比如在web模式下,FILE类是被禁用的,所以指望通过写文件来操作相关功能参数的方法是不可行的.下面,是我对这方面的一些理解.本文中如果没有特殊说明,下载的资源都是AssetBundle web程序的运行流程大致是 首先加载web.html,这是整个程序的入口 他会加载相关的unity3d文件(本例

PQJ 1686(栈栈栈)

PQJ  1686 用栈解决问题 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Description A math instructor is too lazy to grade a question in the exam papers in which students are supposed to produce a complicated formula for the que

Java数据结构与算法(3) - 栈(栈和转置)

栈的基本特性是后进先出,最简单的用途是用于转置,还有其他诸如括号匹配,中序表达式(A+B*(C-D/(E+F)) --> ABCDEF+/-*+)和后续表达式(345+*612+/- --> 3*(4+5)-6/(1+2))互换等高级用法. 示例代码: package chap04.Reverse; import java.io.*; // for I/O class StackX { private int maxSize; private char[] stackArray; privat