`

栈和队列的实现

阅读更多
本文主要讲栈和队列的实现方法,所以仅简单介绍栈和队列的概念,如果有疑问可以去查有关栈和队列的详细资料。

栈 Stack(LIFO线性表):
栈是一种特殊的线性表,满足后进先出,它限定仅可以在表尾进行删除和增加。push(), pop(), peek(),empty()是它的三个重要的方法。push()是往栈里压入一个元素;pop()是弹出栈顶元素,栈顶指针指向下一个元素;peek()是返回栈顶元素,但不删除栈顶元素;empty是判断栈是否为空。

队列 Queue(FIFO线性表):
队列也是一种特殊的线性表,与栈的规则相反,它满足先进先出原则,它限定只能在表尾添加元素,在表头删除元素。它的基本操作有offer(),poll(),peek()。offer()为在表尾添加一个元素,poll()为在表头删除一个元素,peek()为得到表头的元素,但不删除此元素。对于队列对应的还有三个操作 add(),remove(),element(),这三个操作可以完成相同的功能,但是如果后者操作失败会抛出异常,而前者返回具体的值(null,false等,要看具体的操作)。

***
不过请大家记住一点,不是所有的队列都是FIFO,比如优先队列,它是根据各元素的优先级来决定顺序的。

了解了栈和队列的基本操作,下面我们学习它们的具体实现。

1. Stack类的实现
JDK中写道,Stack类是继承了Vector类, Vector类在java中可以实现自动增长的动态数组。在这里我们用一个普通的对象数组来实现Stack类。代码如下:
public class Stack {
	
	private int top;
	private Object[] data;
	
	//初始化堆栈
	public Stack(int size){
		data = new Object[size];
		top = -1;
	}
	
	public boolean empty(){
		return top == -1;
	}
	
	public void push(Object object) {
		if(top == data.length-1){
			System.out.println("栈满");
		}
		data[++top] = object;
	}
	
	public Object pop() {
		if(top == -1){
			System.out.println("栈空");
			return null;
		}
		return data[top--];
	}
	
	public Object peek() {
		if(data == null || data.length == 0)
			return null;
		return data[data.length-1];
	}
}


这是堆栈最基本的实现,可能面试中可能会遇到其他问题,比如实现一个动态堆栈,当然在JDK中用vector类实现的堆栈本身就是动态堆栈,因为vector类可以实现可变长数组。对于普通对象数组长度是不可变的,上面的代码仅仅实现了一个固定长度的堆栈,如需改成动态堆栈,我们只需要改进push()方法,其他方法保持一致。改进后的push()方法:
public void push(Object object) {
	if(top == data.length-1){
		Object temp[] = new Object[data.length * 2]; // 把数组的容量增加一倍
		for(int i=0; i<data.length; i++) temp[i] = data[i];
			     data = temp;
			     data[++top] = object;
	}
        data[++top] = object;
}


我们还可以用链表来实现堆栈,代码如下:
//首先定义一个链表类
class ListNode{
	Object object;
	ListNode next;
	ListNode(Object object){
		this.object = object;
	}
}

public class Stack {
	ListNode head;
	
	public void push(Object object) {
		ListNode node = new ListNode(object);
		node.next = head;
		head = node;
	}
	
	public Object pop() {
		if(head != null) {
			Object element = head.object;
			head = head.next;
			return element;
		}
		return null;
	}
	
	public Object peek() {
		return head.object;
	}
	
	public boolean empty() {
		return head == null;
	}
}


2. 队列的实现
首先我们要搞清楚,队列是接口不是类,它不可以实例化,也就是不可以new queue(),接口的使用必须依赖于实现它的类,对于接口的引用,采用的是实例化实现该接口的类。下面我们用链表来实现一个队列。
class ListNode{
	Object object;
	ListNode next;
	ListNode(Object object){
		this.object = object;
	}
}
public class QueueDemo {
	ListNode head;
	ListNode tail;
	
	public void offer(Object object) {
		if(head == null){
			tail = new ListNode(object);
			head = tail;
		} else {
			tail.next = new ListNode(object);
			tail=tail.next;
		}
	}
	
	public Object poll() {
		if(head != null) {
			Object element = head.object;
			head = head.next;
			if(head == null) tail = null;
			return element;
		} 
		return null;
	}
	
	public Object peek() {
		if(head == null)
			return null;
		return head.object;
	}
}


总结:我们用数组实现了固定长度的堆栈和动态堆栈,然后用链表分别实现了堆栈和队列。堆栈和队列之间也可以相互实现,只要记住队列是先进先出,只可以在队尾添加元素,在对头删除元素;堆栈是后进先出,只可以在表尾添加或删除元素。

以上只是个人总结,希望朋友们多多交流,共同进步!
分享到:
评论

相关推荐

    利用栈和队列实现迷宫

    "利用栈和队列实现迷宫" 通过栈和队列两种不同的方法来实现迷宫问题。队列方法求出的迷宫路径是最短路径。迷宫问题是指在一个迷宫中找到从起点到终点的路径。这里我们使用栈和队列两种数据结构来解决这个问题。 栈...

    C语言用栈和队列实现的回文检测功能示例

    C语言用栈和队列实现的回文检测功能示例 在计算机科学中,回文检测是指判断给定的字符串是否是一个回文的操作。回文是一种特殊的字符串,它可以从左到右阅读或从右到左阅读,结果是一样的。例如,字符串"madam"就是...

    利用C++栈和队列实现回文判断

    利用C++栈和队列实现回文判断 可以自行输入

    用栈和队列实现魔王语言

    运用栈和队列实现魔王语言 英文字母对应转换成中文意思

    用栈和队列实现的c语言停车场

    用栈和队列实现的c语言停车场 数据结构停车场 车进站出站查询

    用栈和队列实现停车场管理

    本主题将探讨如何利用栈和队列来实现一个停车场管理系统。栈具有“后进先出”(LIFO)的特性,而队列则遵循“先进先出”(FIFO)的原则,这两者在模拟特定场景时有其独特的优势。 首先,我们可以将停车场看作一个栈...

    C++开发基于栈和队列实现的电梯模拟程序源码+exe可执行程序+详细注释+项目说明.zip

    1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通,帮助解答。...C++开发基于栈和队列实现的电梯模拟程序源码+exe可执行程序+详细注释+项目说明.zip

    数据结构栈和队列解决迷宫问题

    数据结构栈和队列解决迷宫问题 本文档详细介绍了利用栈和队列解决迷宫问题的步骤,对于初学者学习数据结构能很好的进行辅导。本文档主要涉及到数据结构的两个重要概念:栈和队列,并介绍了如何使用这两个数据结构来...

    数据结构栈和队列(参考代码)

    以上介绍了栈和队列两种基本的数据结构以及它们的不同实现方式——链式存储和顺序存储。这些基础数据结构在编程语言中应用广泛,理解它们的原理和实现对于学习更高级的数据结构和算法至关重要。

    同时使用栈和队列实现回文

    总结来说,通过同时使用栈和队列,我们可以有效地检查一个字符串是否为回文,这种方法充分利用了两种数据结构的特点,使得算法逻辑清晰且易于实现。在实际应用中,理解和灵活运用不同的数据结构是解决复杂问题的关键...

    栈和队列实现数据结构课程中停车场

    在`停车场.cpp`这个文件中,可能包含了停车场类的定义和实现,其中包含栈和队列的数据成员以及相关的操作函数。例如: 1. `park()` 方法:模拟车辆进入停车场,首先检查是否有空位,如果有,从队列中取出车辆压入栈...

    使用栈和队列实现魔王语言解释程序

    在这个项目中,我们将利用数据结构中的栈和队列来解析并解释魔王语言的语句。理解这两种数据结构的工作原理以及如何在实际应用中结合它们是关键。 首先,栈(Stack)是一种后进先出(LIFO,Last In First Out)的...

    栈和队列操作:栈实现、队列实现、双栈实现队列、双队列实现栈、栈实现O(n)求当前栈最大值

    栈实现 队列实现 双栈实现队列 双队列实现栈 栈实现O(n)求当前栈最大值 http://blog.csdn.net/ssuchange/article/details/17398007

    回文-栈和队列

    栈和队列的基本操作及其应用 1、掌握栈和队列的顺序存储结构和链式存储结构,以便在实际中灵活应用。...3、掌握栈和队列的基本运算,如:入栈与出栈,入队与出队等运算在顺序存储结构和链式存储结构上的实现。 回文判断

    利用栈和队列实现的计算器的C语言

    在本主题中,我们将深入探讨如何使用栈和队列这两种基本数据结构来实现一个简单的计算器,该计算器用C语言编写并通过了测试。下面将详细阐述相关知识点。 首先,栈是一种后进先出(LIFO)的数据结构,它类似于现实...

    栈和队列的基本操作实现及其应用

    本节提供了多个栈和队列的实现和应用实例,例如: * 实现一个算法,判断依次读入的一个以@为结束符的字符序列,是否为回文。 * 编程模拟队列的管理,主要包括:出队列、入队、统计队列的长度、查找队列某个元素 e、...

    C++实现的任意进制转换(数据结构——栈和队列)

    本文将深入探讨如何使用C++语言实现任意进制转换,特别是涉及到小数部分的处理,并结合数据结构中的栈和队列进行阐述。C++作为一门强大的静态类型语言,其丰富的库支持和高效性能使得它成为实现这种算法的理想选择。...

    数据结构P50.改栈用来队列实现迷宫。输出从开始到终点的路径。

    总之,通过栈来模拟队列实现BFS,解决迷宫问题是一种创新且有效的策略。这种技巧展示了数据结构在解决问题时的灵活性,同时也强调了理解并掌握各种数据结构及其特性的必要性。在实际开发中,灵活运用数据结构往往能...

    利用栈和队列实现后缀表达式转中缀表达式

    栈和队列是数据结构中的基本工具,在处理后缀表达式转中缀表达式的过程中起着至关重要的作用。 1. **后缀表达式的基本概念** 后缀表达式是一种没有括号的表达式表示方法,操作符位于操作数之后。例如,中缀表达式 ...

    数据结构实验栈和队列详细实验报告

    2. **链式存储结构**:链式存储结构使用链表来实现栈和队列,每个元素包含数据域和指针域,指针域指向下一个元素。这样,插入和删除操作只需要改变几个指针,而不需要移动元素。链式结构提供了更大的灵活性,但元素...

Global site tag (gtag.js) - Google Analytics