Stack 表示后进先出(LIFO)的对象堆栈,也是表的一种。
主要有如下几个方法:
public AnyType push(AnyType x); public AnyType pop(); public boolean isEmpty(); public AnyType peek(); public int search(AnyType x);
详细介绍看这里。 这里主要看如何实现。打算用四种方法实现: 数组、Node链、ArrayList和LinkedList
所以首先先写一个interface,定义好要实现的方法,如下:
package com.matt.stack; public interface IStack<AnyType> { public AnyType push(AnyType x); public AnyType pop(); public boolean isEmpty(); public AnyType peek(); public int search(AnyType x); }
然后用第一种方法数组实现:
package com.matt.stack; public class MyArrayStack<AnyType> implements IStack<AnyType> { private static final int DEFAULT_CAPACITY = 2; private AnyType[] theItems; private int thetopOfStack; public MyArrayStack() { doClear(); } public void clear() { doClear(); } private void doClear() { thetopOfStack = -1; ensureCapacity(DEFAULT_CAPACITY); } public AnyType push(AnyType x) { if (theItems.length == size()) ensureCapacity(size() + 1); theItems[++thetopOfStack] = x; return x; } public AnyType pop() { if (thetopOfStack == -1) throw new ArrayIndexOutOfBoundsException(); return theItems[thetopOfStack--]; } public AnyType peek() { return theItems[thetopOfStack]; } @Override public int search(AnyType x) { if (x == null) { for (int i = 0; i < theItems.length; i++) if (theItems[i] == null) return size() - i; } else for (int i = 0; i < theItems.length; i++) if (theItems[i].equals(x)) return size() - i; return -1; } private void ensureCapacity(int newCapacity) { AnyType[] old = theItems; theItems = (AnyType[]) new Object[newCapacity]; for (int i = 0; i < size(); i++) theItems[i] = old[i]; } public boolean isEmpty() { return size() == 0; } private int size() { return thetopOfStack + 1; } public String toString() { String l = "["; for (int i = 0; i < size(); i++) { if (i == size() - 1) l += theItems[i]; else l += theItems[i] + ","; } l += "]"; return l; } /** * @param args */ public static void main(String[] args) { MyArrayStack<String> stack = new MyArrayStack<String>(); System.out.println(stack); stack.push("1"); stack.push("2"); stack.push("3"); stack.push("4"); System.out.println(stack.search("1")); System.out.println(stack); stack.pop(); stack.pop(); System.out.println(stack); System.out.println(stack.peek()); stack.clear(); System.out.println(stack); } }
第二种方法Node链:
package com.matt.stack; public class MyLinkedStack<AnyType> implements IStack<AnyType> { private Node<AnyType> beginMarker; private int theSize; public MyLinkedStack() { clear(); } public void clear() { theSize = 0; beginMarker = new Node<AnyType>(null, null); } public AnyType pop() { AnyType data = peek(); theSize--; return data; } @Override public boolean isEmpty() { return size() == 0; } @Override public int search(AnyType x) { Node<AnyType> p = beginMarker; if (x == null) { for (int i = 0; i < size(); i++) if ((p = p.next).data == null) return size() - i; } else { for (int i = 0; i < size(); i++) if ((p = p.next).data.equals(x)) return size() - i; } return -1; } public AnyType peek() { return getLastNode().data; } private Node<AnyType> getLastNode() { Node<AnyType> p = beginMarker; for (int i = 0; i < size(); i++) p = p.next; return p; } public AnyType push(AnyType x) { Node<AnyType> last = getLastNode(); Node<AnyType> newNode = new Node<AnyType>(x, null); last.next = newNode; theSize++; return x; } private int size() { return theSize; } private static class Node<AnyType> { public AnyType data; public Node<AnyType> next; public Node(AnyType d, Node<AnyType> n) { this.data = d; this.next = n; } } public String toString() { String l = "["; Node<AnyType> p = beginMarker; for (int i = 0; i < size(); i++) { p = p.next; if (i == size() - 1) l += p.data; else l += p.data + ","; } l += "]"; return l; } public static void main(String[] args) { MyLinkedStack<String> stack = new MyLinkedStack<String>(); System.out.println(stack); stack.push("1"); stack.push("2"); stack.push("3"); stack.push("4"); System.out.println(stack.search("3")); System.out.println(stack); stack.pop(); stack.pop(); System.out.println(stack); System.out.println(stack.peek()); stack.clear(); System.out.println(stack); } }
第三种 ArrayList
package com.matt.stack; import java.util.*; import com.matt.MyArrayList; public class MyArrayListStack<AnyType> implements IStack<AnyType> { private List<AnyType> theItems = new ArrayList<AnyType>(); public MyArrayListStack() { } public AnyType push(AnyType x) { theItems.add(x); return x; } public AnyType pop() { return theItems.remove(theItems.size() - 1); } public AnyType peek() { return theItems.get(theItems.size() - 1); } public void clear() { theItems = new ArrayList<AnyType>(); } @Override public boolean isEmpty() { return theItems.size() == 0; } @Override public int search(AnyType x) { if (x == null) { for (int i = 0; i < size(); i++) if (theItems.get(i) == null) return size() - i; } else for (int i = 0; i < size(); i++) if (theItems.get(i).equals(x)) return size() - i; return -1; } private int size() { return theItems.size(); } public String toString() { String l = "["; for (int i = 0; i < theItems.size(); i++) { if (i == theItems.size() - 1) l += theItems.get(i); else l += theItems.get(i) + ","; } l += "]"; return l; } /** * @param args */ public static void main(String[] args) { MyArrayListStack<String> stack = new MyArrayListStack<String>(); System.out.println(stack); stack.push("1"); stack.push("2"); stack.push("3"); stack.push("4"); System.out.println(stack.search("1")); System.out.println(stack); stack.pop(); stack.pop(); System.out.println(stack); System.out.println(stack.peek()); stack.clear(); System.out.println(stack); } }
写第三种的时候发现几乎和第一种差不多,所以第4种有了前面几种的示范应该很简单,特别是第二种,这里就不实现了。
下一节主要以一个四则运行表达式转逆波兰式来总结一下stack的运用。
相关推荐
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。在这个主题中,我们将专注于栈...在实际项目中,我们可以根据需求选择标准库的`<stack>`容器,或者自定义更高效、更符合特定需求的栈实现。
2. **C++中的栈实现**: - C++标准库提供了一个名为`<stack>`的头文件,它包含了一个模板类`std::stack`,可以使用各种容器(如`std::vector`或`std::deque`)作为其底层实现。 - 使用`std::stack`,我们可以直接...
二进制漏洞挖掘-栈溢出-开启Canary 本文将详细介绍二进制漏洞挖掘-栈溢出-开启Canary的相关知识点。 栈溢出漏洞 栈溢出漏洞是一种常见的二进制漏洞,发生在程序对栈缓冲区进行写操作时,未对缓冲区大小进行判断,...
### C语言实现栈的功能 #### 一、栈的基本概念与特点 栈是一种特殊的线性表,只允许在表的一端进行插入和删除操作。这一端称为栈顶(top),另一端称为栈底(bottom)。栈遵循先进后出(FILO, First In Last Out)的原则...
"算法大全-面试题-链表-栈-二叉树-数据结构"这个压缩包文件提供了丰富的知识资源,旨在帮助学习者深入理解和应用这些核心概念。 链表是一种线性数据结构,与数组不同,它的元素在内存中不是连续存储的。链表由一...
本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+"、减号"-"、乘号"*"和除号"/")以及括号用于改变运算顺序。...
1. 安装:下载的ZStack-CC2530-2.5.1a.exe是一个可执行文件,运行该文件将开始安装过程。安装过程中,系统会提示用户选择安装路径和配置选项。 2. 集成开发环境(IDE):ZStack通常与IAR Embedded Workbench或CCS ...
《揭开ZigBee 2006协议栈Z-Stack的“开源”面纱》 ZigBee 2006协议栈Z-Stack是业界广泛应用的无线通信技术,尤其在物联网(IoT)领域。然而,当我们谈论Z-Stack的开源性质时,需要对其开放程度有清晰的理解。Z-Stack...
栈-回溯法-迷宫求解代码实现
ZigBee 2006协议栈Z-Stack是由德州仪器(TI)推出的,它符合ZigBee 2006规范,并且支持多种硬件平台。Z-Stack是一个完整的、几乎全功能的网状网络协议栈,对于ZigBee领域来说具有重要地位。然而,尽管常常被称作开源,...
对于想要深入了解ZigBee协议栈实现的开发者,开源的替代方案如msstatePAN和freakz可能更适合。然而,这些开源栈可能在技术支持、性能和稳定性上与TI的Z-Stack有所差距。TI的CC2480芯片甚至将Z-Stack直接集成到硬件中...
1. **PHY层**:物理层,实现了IEEE 802.15.4标准定义的无线传输规范,包括调制解调、频率合成和信号强度检测等功能。 2. **MAC层**:媒体访问控制层,负责数据帧的发送和接收,包括信道接入、冲突检测、网络地址...
- 初始化时,栈顶指针(top)设为-1,表示栈为空。 - 入栈操作(push)时,将元素添加到数组的栈顶位置,并更新栈顶指针。 - 出栈操作(pop)时,移除栈顶元素,并更新栈顶指针。 - 需要注意栈的容量限制,当栈...
栈在许多应用场景中都发挥着关键作用,尤其是在实现复杂计算逻辑时,如计算器的运算过程。本篇将详细介绍如何使用C语言实现一个基于栈的计算器。 首先,我们需要理解栈的基本操作:入栈(push)、出栈(pop)、查看...
标题"profinet协议栈源码"指的是这个项目是关于PROFINET通信协议的软件实现,其核心是协议栈的源代码。PROFINET是一种基于以太网技术的工业自动化网络标准,由德国西门子公司发起,广泛应用于制造业自动化领域。 ...
数据结构--栈的实现(链栈)--带头节点。
可执行程序可以实现数学...下载压缩包后需要减压文件,在目录下在linux命令行输入要计算的公式的字符串即可求出结果,例如在linux命令行下输入执行命令 :./calculator "1+2*3-(6-3)*2+4-1" 即可求出字符串公式的结果。
迷宫-用栈实现的,数据结构严蔚敏版上的,迷宫-用栈实现的,数据结构严蔚敏版上的
### C语言顺序栈实现十进制到二进制、八进制、十六进制的转换 #### 一、概述 本篇文章将详细介绍如何使用C语言中的顺序栈来实现十进制数字向二进制、八进制以及十六进制的转换。通过分析给出的代码示例,我们将...