`

栈(1)-----栈的实现

 
阅读更多

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的运用。

 

分享到:
评论

相关推荐

    数据结构--栈--实现算法

    数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。在这个主题中,我们将专注于栈...在实际项目中,我们可以根据需求选择标准库的`&lt;stack&gt;`容器,或者自定义更高效、更符合特定需求的栈实现。

    栈操作----

    2. **C++中的栈实现**: - C++标准库提供了一个名为`&lt;stack&gt;`的头文件,它包含了一个模板类`std::stack`,可以使用各种容器(如`std::vector`或`std::deque`)作为其底层实现。 - 使用`std::stack`,我们可以直接...

    二进制漏洞挖掘-栈溢出-开启Canary1

    二进制漏洞挖掘-栈溢出-开启Canary 本文将详细介绍二进制漏洞挖掘-栈溢出-开启Canary的相关知识点。 栈溢出漏洞 栈溢出漏洞是一种常见的二进制漏洞,发生在程序对栈缓冲区进行写操作时,未对缓冲区大小进行判断,...

    c语言实现栈的功能!-------------------------

    ### C语言实现栈的功能 #### 一、栈的基本概念与特点 栈是一种特殊的线性表,只允许在表的一端进行插入和删除操作。这一端称为栈顶(top),另一端称为栈底(bottom)。栈遵循先进后出(FILO, First In Last Out)的原则...

    算法大全-面试题-链表-栈-二叉树-数据结构

    "算法大全-面试题-链表-栈-二叉树-数据结构"这个压缩包文件提供了丰富的知识资源,旨在帮助学习者深入理解和应用这些核心概念。 链表是一种线性数据结构,与数组不同,它的元素在内存中不是连续存储的。链表由一...

    栈的应用----算术表达式求值程序

    本文将深入探讨如何利用栈来实现一个算术表达式求值的程序。 首先,我们要理解算术表达式的构成。一个基本的算术表达式可能包含数字、运算符(如加号"+"、减号"-"、乘号"*"和除号"/")以及括号用于改变运算顺序。...

    zigbee CC2530 协议栈zstack-cc2530-2.5.1包含完整可用的库文件

    Zigbee CC2530协议栈ZStack-CC2530-2.5.1是基于TI公司的CC2530微控制器的Zigbee通信协议实现,这是一个广泛应用...通过理解ZStack的各个层次和组件,可以有效地利用Zigbee CC2530协议栈实现高效、可靠的无线网络通信。

    ZStack协议栈 ZStack-CC2530-2.5.1a

    1. 安装:下载的ZStack-CC2530-2.5.1a.exe是一个可执行文件,运行该文件将开始安装过程。安装过程中,系统会提示用户选择安装路径和配置选项。 2. 集成开发环境(IDE):ZStack通常与IAR Embedded Workbench或CCS ...

    揭开ZigBee 2006协议栈Z-Stack的”开源“面纱.pdf

    《揭开ZigBee 2006协议栈Z-Stack的“开源”面纱》 ZigBee 2006协议栈Z-Stack是业界广泛应用的无线通信技术,尤其在物联网(IoT)领域。然而,当我们谈论Z-Stack的开源性质时,需要对其开放程度有清晰的理解。Z-Stack...

    栈-回溯法-迷宫求解代码实现

    栈-回溯法-迷宫求解代码实现

    揭开ZigBee 2006协议栈Z-Stack的”开源“面纱 (2).docx

    ZigBee 2006协议栈Z-Stack是由德州仪器(TI)推出的,它符合ZigBee 2006规范,并且支持多种硬件平台。Z-Stack是一个完整的、几乎全功能的网状网络协议栈,对于ZigBee领域来说具有重要地位。然而,尽管常常被称作开源,...

    揭开ZigBee 2006协议栈Z-Stack的”开源“面纱.docx

    对于想要深入了解ZigBee协议栈实现的开发者,开源的替代方案如msstatePAN和freakz可能更适合。然而,这些开源栈可能在技术支持、性能和稳定性上与TI的Z-Stack有所差距。TI的CC2480芯片甚至将Z-Stack直接集成到硬件中...

    zigbee最新的协议栈(ZStack-CC2530-2.5.1a.zip)

    1. **PHY层**:物理层,实现了IEEE 802.15.4标准定义的无线传输规范,包括调制解调、频率合成和信号强度检测等功能。 2. **MAC层**:媒体访问控制层,负责数据帧的发送和接收,包括信道接入、冲突检测、网络地址...

    顺序栈的设计和实现---

    - 初始化时,栈顶指针(top)设为-1,表示栈为空。 - 入栈操作(push)时,将元素添加到数组的栈顶位置,并更新栈顶指针。 - 出栈操作(pop)时,移除栈顶元素,并更新栈顶指针。 - 需要注意栈的容量限制,当栈...

    profinet协议栈源码 【基于p-net的移植,适用于stm32平台】

    标题"profinet协议栈源码"指的是这个项目是关于PROFINET通信协议的软件实现,其核心是协议栈的源代码。PROFINET是一种基于以太网技术的工业自动化网络标准,由德国西门子公司发起,广泛应用于制造业自动化领域。 ...

    栈实现计算器(C语言实现)

    栈在许多应用场景中都发挥着关键作用,尤其是在实现复杂计算逻辑时,如计算器的运算过程。本篇将详细介绍如何使用C语言实现一个基于栈的计算器。 首先,我们需要理解栈的基本操作:入栈(push)、出栈(pop)、查看...

    数据结构--栈的实现(链栈)--带头节点

    数据结构--栈的实现(链栈)--带头节点。

    栈的应用-计算器实现

    可执行程序可以实现数学...下载压缩包后需要减压文件,在目录下在linux命令行输入要计算的公式的字符串即可求出结果,例如在linux命令行下输入执行命令 :./calculator "1+2*3-(6-3)*2+4-1" 即可求出字符串公式的结果。

    C语言实现栈操作

    栈操作:1表示入栈操作,后跟一个整数(不为1/0和-1)为入栈元素,0表示出栈操作,-1表示操作结束。从标准输入读取一组栈操作,入栈的整数和表示栈操作的整数之间都以一个空格分隔,输出出栈元素序列。

Global site tag (gtag.js) - Google Analytics